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 了。

信号处理函数只能访问全局对象

参考

多进程的服务端