2010-05-04 26 views
1

人。对于学术练习,我必须在c语言中为nix平台实现一个程序,该程序通过信号处理来同步多个进程,仅使用信号,暂停,终止和分叉基本函数。 我搜索谷歌,还没有找到任何明确的例子:我希望你们中的一个人的智慧会照亮我的方式。 谢谢!如何通过基本信号处理同步c中的多个进程

+0

哎呀,虐待狂教授警惕。他有没有听说过锁和信号灯? – 2010-05-04 06:01:38

+0

@atreyu:“flock”怎么样(http://linux.die.net/man/2/flock)? – outis 2010-05-04 06:32:15

+0

感谢您的反馈: @Keith信号量在下一个练习中,这只是为了教育 - 虐待目的 @outis好点,但我害怕我只能使用信号处理的基本功能 – jneira 2010-05-04 06:37:50

回答

2

pause直到收到信号才会返回。基本设计是这样的:

  • fork在每个工人创造必要的工作人员
  • SIGINT。该处理程序设置一个标志,意味着该进程在完成当前工作后应该退出。
  • 每个过程都可以工作,然后pause s。重复,除非收到SIGINT(在pause之后&之前的测试)。
  • 当一个过程具有可用于另一过程的工作,它用信号与SIGCONT
  • 其他进程存在对过程中没有更多的工作时,与SIGINT信号它。

这并不完全包括对共享数据的同步访问。当一个进程信号的另一个工作是可用的,它应该pause

当然,这恰恰违背了并发编程的目的

  • :要做到这一点,你可以添加额外的规则。由于大多数系统调用被信号中断(导致它们返回-1,其中errno设置为EINTR),因此您必须处理这种意外情况,重复每个受影响的系统调用,直到成功为止。例如:

    while ((readCount = read(...)) < 0 && errno == EINTR) {} 
    
+0

我用类似的设计完成了练习,谢谢! – jneira 2010-05-05 05:31:34

+0

虽然这似乎是一个好主意,但如果两个进程在短时间内都发送一个其他进程为SIGCONT,则该进程可能会失败,因为该进程可能只会收到一个SIGCONT,从而“失去”第二个工作(请参阅我的文章细节)。通过给每个工作人员一个“队列”作业并将SIGCONT的解释从“作业已准备就绪”更改为“至少有一个作业已准备就绪”,可以解决此问题,但这需要能够自动更新队列...在循环中使用文件系统重命名可能实现? – 2010-05-05 05:50:10

+1

@j:这是'SIGCONT'在我的大纲中的功能:打破'暂停'。请注意,“每个流程都可以运行。” “暂停”和“SIGCONT”仅仅是为了防止忙碌等待。 – outis 2010-05-05 09:15:23

2

需要注意的一件重要的事情是,Linux(至少和可能还有很多其他Unices)可以将同一类型的多个信号合并为一个实例。因此,如果您发送一个处理值为x的信号,则该过程将被保证接收;但是如果您发送两个或更多值为x的信号,则该过程只能保证至少接收其中一个信号。

另外,信号不保证按照发送顺序接收信号。 (为什么?在引擎盖下,Linux为每个进程记录哪些未完成的信号已经发送,每当进程被调度程序唤醒时,为所有未完成信号的信号处理程序以任意顺序运行。 )

这一切意味着信号通常不适合同步过程。它们只在信号之间的时间间隔相对于接收过程的唤醒时间之间的间隔较大时才可靠地工作。如果一个过程花费了很多时间,唤醒事件可以任意分开。

结论:不要使用IPC的信号。

+0

也许这个作业的重点是要显示所有的。 – mouviciel 2010-05-04 07:41:51

+0

jum the lesson is more complete with this point thanks – jneira 2010-05-04 14:53:22