Socket编程--TCP服务端注意事项

  • 僵尸进程处理
    •   僵尸进程和孤儿进程
      •   基本概念:我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。(大体就是父进程必须去得到子进程的结束信息,如果没有得到的就是僵尸,死了还在系统中,父进程不知道。)
      •   孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
      •   僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
      •   孤儿进程和僵尸进程的危害:
        •   孤儿:孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。
        •   僵尸:如果大量产生僵尸进程(僵尸进程的进程号以及一些其他的东西会保留下来),那么就会使得系统中的进程号被太多的占去,就没有办法产生新的进程了,所以僵尸应当避免。
        • 更详细的内容请参考:http://www.cnblogs.com/Anker/p/3271773.html


    •   处理方法
      •   ①:通过忽略SIGCHLD信号,避免僵尸进程
        在server端代码中添加
        signal(SIGCHLD, SIG_IGN);
        SIG_IGN:这个是忽略信号

        SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
        signal()函数理解,在<signal.h> 这个头文件中。

        signal(参数1,参数2);

        参数1:我们要进行处理的信号。

        参数2:我们处理的方式(是系统默认还是忽略还是捕获)。SIG_IGN,SIG_DFL,

         
      •   ②:通过wait/waitpid方法,解决僵尸进
        signal(SIGCHLD,onSignalCatch);  
        
        onSignalCatch:如果父进程希望被告知其子系统的这种状态,则应捕捉此信号,这个是捕捉信号
        void onSignalCatch(int signalNumber) {  wait(NULL); }
  • TCP协议的11中状态
    •   
    •   详细信息参考:http://www.cnblogs.com/Kobe10/p/5770585.html



  • close和shutdown 的区别
    •   当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:
      close(sockfd);
    •   你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继续进行。如你可以关 闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据。
      • 使用close中止一 个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。
        shutdown可直接关闭描述符,不考虑描述 符的参考数,可选择中止一个方向的连接。


  • 完整的地址:http://blog.csdn.net/zjf280441589/article/details/44259777
原文地址:https://www.cnblogs.com/Kobe10/p/5771909.html