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
  • 相关阅读:
    C++中的字符串可以这样换行写
    2020年最受欢迎的 10 门编程语言
    10 本最适合初学者和高级程序员的Python书籍
    手把手教你用 Python + Flask 搭建个人博客
    CentOS VS Ubuntu,谁才是更好的 Linux 版本?
    Python丨为什么你学不好设计模式?
    突破C++瓶颈,在此一举!
    从零上手 GDB 调试,看这个教程就够了~
    搞机器学习需要数学基础吗?
    用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
  • 原文地址:https://www.cnblogs.com/Kobe10/p/5771909.html
Copyright © 2011-2022 走看看