zoukankan      html  css  js  c++  java
  • signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);

    signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧
    //因为并发服务器常常fork很多子进程,子进程终结之后需要
    //服务器进程去wait清理资源。如果将此信号的处理方式设为
    //忽略,可让内核把僵尸子进程转交给init进程去处理,省去了
    //大量僵尸进程占用系统资源。(Linux Only)

     

    some code();

     

    pid = fork(); //生成一个子进程
    if (pid < 0) // error check.
    handle_err();

     

    if (pid == 0)
    exit (execl(....)); // child process.
    else
    if (wait(&ret) < 0)
    perror(/"wait/"); //parent process
    //在这里wait,都会得No Such process的错误,
    //因为子进程终止后,内核会向父进程发送SIGCHLD
    //信号,但是上面已将此信号设为忽略,实质上由
    //init来接收此子进程的处理。
    对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

    signal(SIGCHLD,SIG_IGN);

    这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

    http://blog.csdn.net/liuchao1986105/article/details/6440896

     signal(SIGPIPE, SIG_IGN);

    TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 

    但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制, 
    一个端点无法获知对端的socket是调用了close还是shutdown.
    
    对一个已经收到FIN包的socket调用read方法, 
    如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送). 
    但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以, 
    第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.
    
    为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:
    
    signal(SIGPIPE, SIG_IGN);
    
    这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.
    http://blog.csdn.net/xinguan1267/article/details/17357093

    SIGHCLD
    是unix的一种信号。
    SIGCHLD信号是子进程结束时,向内核发送的信号。
    无论进程是正常终止,还是不正常终止,都会向内核发送SIGCHLD信号。
    如果父进程不等待子进程结束,子进程将有可能成为僵尸进程(zombie)从而占用系统资源。
    因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。
    可以用如下语句:
    signal(SIGCHLD,(void *)handle);
    handle此处代表一个处理 SIGCHLD信号,引起的函数。
    但是在一些并发性特别高的服务器端,有时候又需要对此信号进行忽略。因为,每一个子进程终止时都会向内核发送此信号,如果并发性特别多,将影响服务器处理速率。
    可以用如下语句
    signal(SIGCHLD,SIG_IGN );

    #define SIG_ERR (void (*) ())-1

    #define SIG_DFL (void (*) ())0

    #define SIG_IGN (void (*) ())1

    signal.h中的宏定义SIG_DFL及SIG_IGN

    SIG_DFL,SIG_IGN 分别表示无返回值的函数指针,指针值分别是0和1,这两个指针值逻辑上讲是实际程序中不可能出现的函数地址值。

    SIG_DFL:默认信号处理程序

    SIG_IGN:忽略信号的处理程序

    下面是一个指针值测试实例:

    复制代码
    #include <stdio.h>
    #define SIG_DFL ((void(*)(int))0)
    #define SIG_IGN ((void(*)(int))1)
    
    int main() {
        int a = (int) SIG_DFL;
        int b = (int) SIG_IGN;
    
        printf("a = %d/n", a);  //0
        printf("b = %d/n", b);  //1
    
        return 0;
    }
    复制代码

    注:(void(*)())0表示将常数0转型为“指向返回值为void的函数的指针”。

     转载自:http://www.cnblogs.com/liulipeng/p/3555450.html

  • 相关阅读:
    Python中if __name__ == '__main__':作用
    mac 用macports给python装opencv
    (转)学习&使用技术的四种层次
    图像处理入门,一些简单的基于像素几何变换和实现
    基于水平投影,垂直投影的字符图像分割思路和代码实现
    转:Cannot make a static reference to the non-static解决办法
    BP神经网络学习和c++例子程序代码
    python中初始化一个数组用来存储多张图片
    假期第二周周总结
    假期第一周周总结
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4048800.html
Copyright © 2011-2022 走看看