signal(i, SIG_IGN) 作用
// 忽略全部的信号,不希望被打扰。顺便解决了僵尸进程的问题。
for (int ii=1;ii<=64;ii++) signal(ii,SIG_IGN);
kill(0, SIGTERM) 作用
kill(0,SIGTERM); // 向全部的子进程发送15的信号,通知它们退出。
因为在子进程中 SIGTERM
是退出信号。
父进程关掉 clientsocket, 子进程关掉 listensocket
int pid=fork();
if (pid==-1) { perror("fork()"); return -1; } // 系统资源不足。
if (pid> 0)
{ // 父进程。
tcpserver.closeclient(); // 父进程关闭客户端连接的socket。
continue; // 父进程返回到循环开始的位置,继续受理客户端的连接。
}
tcpserver.closelisten(); // 子进程关闭监听的socket。
- 在
/proc/xxx
下面的是进程相关资源,里面的 fd 是根据当前最小可用来递增的。 - 如果父进程不关
clientsocket
, 那么每次accept
之后,fd 都需要增加一个,然后在后面的fork
中,这些递增的 fd 也都会被复制到子进程中。对于子进程来说,它不需要其他子进程相关的 =clientsocket=,所以完全是浪费资源。 - 子进程只需要自己对应的
clientsocket
, 不需要listensocket
. listensocket
是专门给父进程用来监听的。
子进程结束需要 return
return 0; // 子进程一定要退出,否则又会回到accept()函数的位置。
如果子进程结束没有 return=,让进程退出,那么会在 =while
中重新回到
accept
这个地方,进行了监听,然后 fork
了。