案例是:我注册了一个带信号功能的信号处理程序。 问题是:
是否始终独立于进程状态调用处理程序? (我的意思是它停止等)。那里发生了什么?(依赖于州)
处理程序函数是否被系统注册为某些“特殊函数”(即当handeler运行时,其他信号未被接收并被放入堆栈或类似于smth。或者可能只是忽略它们。)如果没有,想象当处理程序strats,进程获得另一个信号,然后再次调用此处理程序,尽管“第一个”尚未完成其任务等等。
答案 0 :(得分:4)
“当进程停止时,除了SIGKILL
(...){{1}的默认操作外,在进程继续之前,不会传递发送到进程的任何其他信号。在首次处理任何待处理的未阻塞信号之后,将在进程停止时恢复执行。“ (Unix standard, section Signal Concepts)。
通常,没有什么特别的事情发生。当在Y的信号处理程序中捕获信号X时,执行只是转移到X的处理程序,之后Y的处理程序继续执行。
以下程序演示了此行为。 SIGCONT
向调用进程发送一个信号(就像raise(sig)
)。
kill(getpid(), sig)
这是“安全的”,因为一个进程只接受来自具有相同用户ID(或void hello(int unused)
{
printf("Hello, ");
raise(SIGUSR2);
printf("!\n");
}
void world(int unused)
{
printf("world");
}
int main()
{
signal(SIGUSR1, hello);
signal(SIGUSR2, world);
raise(SIGUSR1);
return 0;
}
)的进程的信号,所以你只能用这种方式射击自己。