【问题标题】:C signal handling with timer使用定时器处理 C 信号
【发布时间】:2012-12-14 11:19:37
【问题描述】:

http://codepad.org/rHIKj7Cd(不是全部代码)

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

每 5 秒:

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

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

【问题讨论】:

  • 你可以使用类似semaphores的东西来同步这两个进程。
  • 我就是这样做的,我很困惑的是把父母和孩子的工作放在哪里。因为当我把它放在现在的位置时,它只是运行一次,如果我把它放在handler函数中,就会有很多不必要的过程。

标签: c signals setitimer


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我正在考虑这个问题,尽管因为我对处理进程、信号量、共享内存还很陌生,所以我认为我不能完全解释您的回答。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多