用定时器处理C信号

时间:2012-12-14 11:19:37

标签: c signals setitimer

http://codepad.org/rHIKj7Cd(不是整个代码)

我想要完成的是父母在共享内存中写东西,然后孩子做出相应的反应,然后每五秒钟写回一些东西。我想过使用SIGUSR1-2,并且可能在处理程序中打开signum,但我不知道如何编写代码,因为setitimer会抛出SIGALRM。我显然不想在处理程序中分叉,因为我只需要一个子节点和一个父节点,所以我如何定义不同的行为?我希望我的目标很明确:

每5秒钟:

  • 计时器
  • 抛出SIGALRM
  • Parent将其计算写入共享内存(正在使用信号量)
  • 孩子从共享内存中读取,回写它的计算

我也知道 signal()不建议使用,这不是重点。

1 个答案:

答案 0 :(得分:1)

定时器信号处理程序应该尽可能少,可能只对父进程等待的信号量进行“post”操作。然后父进程执行它,然后在子进程等待的信号量上使用“post”。孩子完成其工作并通过另一个“帖子”向父母发出信号,然后返回等待信号量,父母可以对孩子的结果做一些事情。最后,父进程返回等待来自定时器信号处理程序的信号量。

当然,进程之间以及从定时器信号处理程序到父进程之间的信令实际上不必是信号量。还有其他方法可以在POSIX系统的进程之间进行通信和发送“信号”,包括从/向管道读/写,在共享内存中设置特殊位或字节,或者消息队列。