信号处理

时间:2010-12-17 21:52:29

标签: unix event-handling signals

案例是:我注册了一个带信号功能的信号处理程序。 问题是:

  1. 是否始终独立于进程状态调用处理程序? (我的意思是它停止等)。那里发生了什么?(依赖于州)

  2. 处理程序函数是否被系统注册为某些“特殊函数”(即当handeler运行时,其他信号未被接收并被放入堆栈或类似于smth。或者可能只是忽略它们。)如果没有,想象当处理程序strats,进程获得另一个信号,然后再次调用此处理程序,尽管“第一个”尚未完成其任务等等。

1 个答案:

答案 0 :(得分:4)

  1. “当进程停止时,除了SIGKILL(...){{1}的默认操作外,在进程继续之前,不会传递发送到进程的任何其他信号。在首次处理任何待处理的未阻塞信号之后,将在进程停止时恢复执行。“ (Unix standard, section Signal Concepts)。

  2. 通常,没有什么特别的事情发生。当在Y的信号处理程序中捕获信号X时,执行只是转移到X的处理程序,之后Y的处理程序继续执行。

  3. 以下程序演示了此行为。 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; } )的进程的信号,所以你只能用这种方式射击自己。