0

我试图在并发服务器 tcp 中使用 fork() 处理多个客户端。它处理第一个客户端,但是当我从 linux 终端运行另一个客户端时,它会继续打印 else 语句。它没有创建子进程来处理它

服务器

while(1){
comm_sock=accept(conn_sock, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr);
if(!fork()){
close(conn_sock);
send(comm_sock, "Data received", 13, 0);
close(comm_sock);
}
else{
cout<<"Parent cannot handle it"<<endl;
close(comm_sock);
}

有人可以帮我吗?

4

1 回答 1

1

我没有测试你的代码,但我认为你应该在完成它的工作后完成你的子进程:

while(1){
    comm_sock=accept(conn_sock, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr);
    if(!fork()){
       /*Child process*/
       close(conn_sock);
       send(comm_sock, "Data received", 13, 0);
       close(comm_sock);
       _exit(EXIT_SUCCESS);
    }
    else{
       cout<<"Parent cannot handle it"<<endl;
      close(comm_sock);
    }
}

只有一个建议:使用此代码,您将完成大量已失效的子进程。如果您的父进程不照顾它们,那么一旦一个子进程死亡,它将以失效或僵尸状态结束。父进程应该知道 SIGCHLD 信号,以便从系统中删除死子进程。

查看 wait 或 waitpid 的手册页: man wait / man waitpid

此外,互联网上有很多关于这方面的例子。

于 2013-10-19T14:22:09.317 回答