Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用双叉技术实现并发服务器,为C中的每个客户机请求创建一个工作进程?_C_Linux_Server_Fork_Daemon - Fatal编程技术网

如何使用双叉技术实现并发服务器,为C中的每个客户机请求创建一个工作进程?

如何使用双叉技术实现并发服务器,为C中的每个客户机请求创建一个工作进程?,c,linux,server,fork,daemon,C,Linux,Server,Fork,Daemon,我正在尝试使用守护进程和fifo(命名管道)在C中实现一个并发服务器。我的服务器和客户端应用程序成功通信,但我希望我的服务器同时处理多个客户端请求。为了处理多个客户端请求,我必须使用双叉技术创建单独的工作进程。我认为我需要在服务器的无限循环开始时分叉我的工作进程 然而,通过这种方式,服务器创建了大量的进程,并且从不停止侦听新的客户端请求。在某个时候,我应该阻止创建新的流程,但我不知道怎么做。我认为第二个子进程末尾的exit(0)函数应该这样做并杀死第二个子进程,但它似乎不起作用,程序在无限循环中

我正在尝试使用守护进程和fifo(命名管道)在C中实现一个并发服务器。我的服务器和客户端应用程序成功通信,但我希望我的服务器同时处理多个客户端请求。为了处理多个客户端请求,我必须使用双叉技术创建单独的工作进程。我认为我需要在服务器的无限循环开始时分叉我的工作进程

然而,通过这种方式,服务器创建了大量的进程,并且从不停止侦听新的客户端请求。在某个时候,我应该阻止创建新的流程,但我不知道怎么做。我认为第二个子进程末尾的
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,您能为客户端和服务器添加完整的代码吗。我一直面临一些麻烦,在客户端,它被卡住了。提前谢谢。