zoukankan      html  css  js  c++  java
  • UNP学习第五章(二)

    一、POSIX信号处理

    信号:告知某进程发生了某个事件的通知(软中断),通常是异步的。

    信号可以:由进程发给另一个进程,由内核发给某个进程。

    设置信号处理办法,有三个选择:

    1.写一个函数,在信号发生时立即调用。不过SIGKILL和SIGSTOP不能被捕获。

    有些信号如SIGIO、SIGPOLL和SIGURG。

    2.设置信号处理办法为SIG_IGN来忽略,SIGKILL和SIGSTOP不能忽略

    3.设置信号处理办法为SIG_DFL来设置缺省处理。

    #include <signal.h>
    
    sighandler_t signal(int signum, sighandler_t handler);
    返回值:成功返回以前的信号处理配置,出错返回SIG_ERR
    signum:信号名
    handler:上面三个的一种,函数名,SIG_IGN或SIG_DFL

    对POSIX兼容系统上的信号处理作以下总结:

    • 一旦安装了信号处理程序,便一直安装着。
    • 当一个信号处理程序正在执行时,所递交的信号是阻塞的。包括在sa_mask中定义的信号。
    • 信号在阻塞时生成了多次,解阻塞时只发生一次。
    • 用sigprocmask可以选择性的阻塞和不阻塞一组信号

    二、处理SIGCHLD信号

    当一个进程终止,如果它有子进程处于僵尸状态,则所有僵尸子进程的父进程ID均设置为1。

    警告:在信号处理程序中调用诸如printf这样的标准I/O函数是不合适的。

    太长了,原谅我看不懂。。。。

    三、wait和waitpid函数

    #include <sys/wait.h>
    
    pid_t wait(int *statloc);
    pid_t waitpid(pid_t pid, int *statloc, int options);
    返回:进程ID0成功,-1出错
    statloc:子进程终止状态
    options:

    当服务器创建子进程处理消息后,子进程结束时。会发送SIG_CHILD信号。此时如果有多个进程同时退出,那么

    进程的SIG_CHILD在阻塞时收到,就会只响应一次。

    所以需要wait或waipid处理。

     1 #include "unp.h"
     2 
     3 void
     4 sig_chld(int signo)
     5 {
     6     pid_t pid;
     7     int stat;
     8 
     9     while((pid = waitpid(-1, &stat, WHOHANG)) > 0)
    10         printf("child %d terminated
    ", pid);
    11     return;
    12 }

    我们在网络编程时可能会遇到的三种情况:

    1.当派生子进程时,必须捕获信号SIGCHLD。

    2.当捕获信号时,必须处理被中断的系统调用。

    3.SIGCHLD的信号处理程序必须正确编写,应使用函数waitpid以免留下僵尸进程。

    四、服务器进程终止

    1.在不同主机上启动服务器和客户,并在客户键入一行,若正常。服务器回射

    2.找到服务器子进程,并杀死该进程。子进程发送FIN给客户,客户TCP相应的以ACK响应。

    3.信号SIGCHLD发往服务器并正确处理。

    4.客户TCP从服务器TCP接收FIN并以ACK响应。但客户进程正阻塞在fgets,等待从终端上得到一行。

    5.运行netstat观察客户套接口状态

    6.再键入一行,

    7.看不下去了

    8。。。。。。

    五、SIGPIPE信号

    六、服务器主机崩溃

    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    什么是Redis?
    请写出常用的linux指令
    Maven常用命令有哪些?
    Maven的工程类型有哪些?
    Maven仓库是什么
    什么是Maven?
    Shiro 的优点
    比较 SpringSecurity 和 Shiro
    判断x二进制编码中1的个数的奇偶性
    寻找600851475143的最大素因子的快速算法
  • 原文地址:https://www.cnblogs.com/ch122633/p/8443415.html
Copyright © 2011-2022 走看看