人民。对于一个学术练习,我必须在nix平台上用c实现一个程序,该程序通过信号处理来同步多个进程,仅使用信号、暂停、终止和分叉基本函数。我在谷歌上搜索,没有找到任何明确的例子:我希望你们中的一个人的智慧能照亮我的道路。谢谢!
发布于 2010-05-05 05:39:58
直到接收到信号,pause才会返回。基本设计如下:
fork以创建必要的工作进程,并在每个工作进程中捕获SIGINT。处理程序设置一个标志,表示该进程在完成当前作业后应退出。pauses。重复此操作,除非收到SIGINT (在一个进程可供另一个进程使用工作之前和之后,它会向另一个进程发出SIGCONT这并不完全包括对共享数据的同步访问。为此,您可以添加一个额外的规则:
当一个进程通知另一个进程有工作可用时,它应该pause
当然,这完全违背了并发编程的目的。
由于大多数系统调用都会被信号中断(导致它们返回-1,并将errno设置为EINTR),因此您必须处理这种意外情况,重复每个受影响的系统调用,直到成功为止。例如:
while ((readCount = read(...)) < 0 && errno == EINTR) {}发布于 2010-05-04 14:47:17
需要注意的一件重要的事情是,Linux (至少,可能还有许多其他的Unices) 可以将多个相同类型的信号压缩到一个实例中。因此,如果您向一个进程发送一个值为x的信号,则该进程肯定会接收到该信号;但是,如果您发送2个或更多值为x的信号,则该进程只能保证至少接收其中一个信号。
此外,不能保证以发送的顺序接收信号。
(为什么?在幕后,Linux为每个进程维护一个位掩码,记录发送了哪些未完成的信号。每当进程被调度器唤醒时,所有未完成信号的信号处理程序都会以某种任意顺序运行。)
所有这些都意味着信号通常不适合同步进程。仅当信号之间的时间间隔相对于接收过程的唤醒时间之间的间隔较大时,它们才可靠地工作。如果一个进程被阻塞了很长时间,唤醒事件可能会被任意地分开。
结论:不要在IPC中使用信号。
https://stackoverflow.com/questions/2763058
复制相似问题