LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1030|回复: 1

信号处理问题: signal(SIGUSR2, ) 也可以捕获SIGUSR1 ?

[复制链接]
发表于 2009-12-23 14:34:27 | 显示全部楼层 |阅读模式
signal(SIGUSR2, ) 也可以捕获SIGUSR1 ?

下面的程序,一个问题想问一下:

在main 函数里,只有SIGUSR2 的捕捉函数 “signal (SIGUSR2, (void *)usr2handler);”,可是来了SIGUSR1 的时候,进程还是可以捕获到,并执行相应的处理程序,请问这是为什么?



______________________________________________________________

// 设计一个程序流程:
// 进程不同时收到SIGUSR2 和 SIGCHLD(用SIGUSR1 来模拟) 时的处理机制.

#include <stdio.h>
#include <signal.h>     // for signal()
#include <unistd.h>     // for pause(), getpid(), sleep()

unsigned char g_sigusr1 = 0;
unsigned char g_sigusr2 = 0;

void usr1handler (int sig);
void usr2handler (int sig);

int main (int argc, char *argv[])
{
    printf ("%s's pid: %ld\n", argv[0], (long) getpid());

    signal (SIGUSR2, (void *)usr2handler);
    //signal (SIGUSR1, (void *)usr1handler);

    while (1)
    {
        pause ();
        if (g_sigusr2 == 1)
        {
            printf ("  received sigusr2: %d\n", SIGUSR2);
            g_sigusr2 = 0;
        }
        if (g_sigusr1 == 1)
        {
            printf ("  received sigusr1: %d\n", SIGUSR1);
            g_sigusr1 = 0;
        }
    }

    return 0;
}

void usr1handler (int sig)
{

    if (SIGUSR1 == sig)
            g_sigusr1 = 1;
}

void usr2handler (int sig)
{
    sleep (8);

    // 信号处理函数放这里和放在主函数里, 效果不一样.
    // 1、放在这里, 如果在处理SIGUSR2 的时候, 又来了SIGUSR1, 进程直接退出, 因为这激发了进程对SIGUSR1 的默认处理机制;
    // 2、放在main() 则相当于是两个信号同时作用, 当处理SIGUSR2 的时候, 又来SIGUSR1, 则进程会打断usr2handler(*) 里的延时处理(即sleep(*)), 并继续往下执行完, 然后转入SIGUSR1 的处理程序usr1handler(*) 里, 再然后...
    signal (SIGUSR1, (void *)usr1handler);

    if (SIGUSR2 == sig)
            g_sigusr2 = 1;
}
 楼主| 发表于 2009-12-24 11:25:00 | 显示全部楼层
请知道的大侠指点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表