2010-12-17 170 views
1

这种情况是:我注册一个带信号功能的信号处理程序。 问题:信号处理

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

  2. 处理程序函数被系统注册为一些“特殊函数”(即当handeler运行其他信号没有收到并且被放入堆栈中或者像这样。他们只是被忽略了。)如果不是,想象当处理策略时,进程得到另一个信号,然后这个处理程序再次被调用,尽管“第一个”还没有完成它的任务,等等。

回答

4
  1. “当进程停止,发送到过程中的任何附加信号,不得交付,直到该进程继续,除了SIGKILL(...)的SIGCONT的默认行为是在第一次处理任何挂起的未封锁信号之后,在过程停止点恢复执行。“ (Unix standard, section Signal Concepts。)

  2. 通常情况下,没有什么特别的事情发生。当在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)进程的信号,所以你只能搬起石头砸自己的脚这种方式。

+0

如果X == Y会怎么样? (也就是说,同样的处理程序是想开始?) – DimG 2010-12-17 23:11:09

+0

同样的事情。尝试用'void handle(int sig){raise(sig); }' – 2010-12-17 23:13:28

+0

非常感谢你) – DimG 2010-12-17 23:16:02