这种情况是:我注册一个带信号功能的信号处理程序。 问题:信号处理
处理程序是否始终独立于进程状态调用? (我的意思是停止等)。那里会发生什么?(取决于状态)
处理程序函数被系统注册为一些“特殊函数”(即当handeler运行其他信号没有收到并且被放入堆栈中或者像这样。他们只是被忽略了。)如果不是,想象当处理策略时,进程得到另一个信号,然后这个处理程序再次被调用,尽管“第一个”还没有完成它的任务,等等。
这种情况是:我注册一个带信号功能的信号处理程序。 问题:信号处理
处理程序是否始终独立于进程状态调用? (我的意思是停止等)。那里会发生什么?(取决于状态)
处理程序函数被系统注册为一些“特殊函数”(即当handeler运行其他信号没有收到并且被放入堆栈中或者像这样。他们只是被忽略了。)如果不是,想象当处理策略时,进程得到另一个信号,然后这个处理程序再次被调用,尽管“第一个”还没有完成它的任务,等等。
“当进程停止,发送到过程中的任何附加信号,不得交付,直到该进程继续,除了SIGKILL
(...)的SIGCONT
的默认行为是在第一次处理任何挂起的未封锁信号之后,在过程停止点恢复执行。“ (Unix standard, section Signal Concepts。)
通常情况下,没有什么特别的事情发生。当在Y的信号处理程序中捕获到信号X时,执行将简单地传送给X的处理程序,之后Y的处理程序恢复执行。
以下程序演示了此行为。 raise(sig)
发送一个信号给呼叫过程(这就像kill(getpid(), sig)
)。
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;
}
这是“安全的”,因为一个进程将只接受来自具有相同的用户ID(或root
)进程的信号,所以你只能搬起石头砸自己的脚这种方式。
如果X == Y会怎么样? (也就是说,同样的处理程序是想开始?) – DimG 2010-12-17 23:11:09
同样的事情。尝试用'void handle(int sig){raise(sig); }' – 2010-12-17 23:13:28
非常感谢你) – DimG 2010-12-17 23:16:02