我正在尝试使用并发服务器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);
}
有人可以帮助我吗?
答案 0 :(得分: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页面:man wait / man waitpid
此外,有很多关于互联网的例子。