|
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;
} |
|