如何使用双叉技术实现并发服务器,为C中的每个客户机请求创建一个工作进程?
我正在尝试使用守护进程和fifo(命名管道)在C中实现一个并发服务器。我的服务器和客户端应用程序成功通信,但我希望我的服务器同时处理多个客户端请求。为了处理多个客户端请求,我必须使用双叉技术创建单独的工作进程。我认为我需要在服务器的无限循环开始时分叉我的工作进程 然而,通过这种方式,服务器创建了大量的进程,并且从不停止侦听新的客户端请求。在某个时候,我应该阻止创建新的流程,但我不知道怎么做。我认为第二个子进程末尾的如何使用双叉技术实现并发服务器,为C中的每个客户机请求创建一个工作进程?,c,linux,server,fork,daemon,C,Linux,Server,Fork,Daemon,我正在尝试使用守护进程和fifo(命名管道)在C中实现一个并发服务器。我的服务器和客户端应用程序成功通信,但我希望我的服务器同时处理多个客户端请求。为了处理多个客户端请求,我必须使用双叉技术创建单独的工作进程。我认为我需要在服务器的无限循环开始时分叉我的工作进程 然而,通过这种方式,服务器创建了大量的进程,并且从不停止侦听新的客户端请求。在某个时候,我应该阻止创建新的流程,但我不知道怎么做。我认为第二个子进程末尾的exit(0)函数应该这样做并杀死第二个子进程,但它似乎不起作用,程序在无限循环中
exit(0)
函数应该这样做并杀死第二个子进程,但它似乎不起作用,程序在无限循环中不断创建新进程
服务器:
createDaemon(argv[1]);
umask(0);
mkfifo(serverFifoPath, 0666)
int serverFd = open(serverFifoPath, O_RDONLY);
int dummyFd = open(serverFifoPath, O_WRONLY);
signal(SIGPIPE, SIG_IGN)
for(;;)
{
syslog(LOG_NOTICE, "DAEMON STARTED");
pid_t pid;
if ( (pid = fork()) < 0)
{
syslog(LOG_ERR, "fork error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
else if (pid == 0)
{ /* first child */
if ( (pid = fork()) < 0)
{
syslog(LOG_ERR, "fork error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
else if (pid > 0)
{
exit(0); /* parent from 2nd fork == 1st child */
}
/* second child. */
syslog(LOG_NOTICE, "second child, pid = %d\n", getpid());
//Read PID of the client
pid_t clientPID = 0;
read(serverFd, &clientPID, sizeof(clientPID))
//Server make other reads here
//and other server operations
exit(0); /* I think this exit(0) should kill the second child
after processing client request but it seems not
working and program creates many processes*/
}
/* wait for first child */
if (waitpid(pid, NULL, 0) != pid)
{
syslog(LOG_ERR, "waitpid error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
//original process
}
int clientFd = open(clientFifo, O_WRONLY);
//Server writes to fifo here
close(clientFd);
mkfifo(clientFifo, 0666);
int serverFd = open(serverFifoPath, O_WRONLY);
//Client writes here
int clientFd = open(clientFifo, O_RDONLY);
unlink(clientFifo);
//Client reads here
我从这里得到了我的
createDaemon
函数:FYI:我没有看到“setsid()”,它出现在您引用的“在Linux中创建守护进程”参考中。。。您不应该漏掉它。@TonyB它在createDaemon
函数中。您好,Vontarro,您能为客户端和服务器添加完整的代码吗。我一直面临一些麻烦,在客户端,它被卡住了。提前谢谢。