zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/Kobe10/p/5771909.html
Copyright © 2011-2022 走看看