C - kill系统调用不会唤醒进程

时间:2015-03-11 06:46:02

标签: c multithreading gcc multiprocessing signals

我正在编写一个程序,用于两个子进程之间的同步。请求是:

使用C语言实现并发程序,创建两个子项:发送者和接收者。 发送器循环从标准输入读取字符串并准备文件中单行的“消息”,然后它向接收器发信号通知消息已准备好,它等待接收器发出字符串已被处理的信号(简单地说转换为大写)并打印处理过的字符串。 接收器循环等待发送器的信号,以大写形式转换它,并向发送器发信号通知可以打印该字符串。 父进程在两个进程上等待结束,当发送的消息是字符串“end”时终止。然后主进程必须打印已发送消息的数量。

因为同步我必须只使用信号,杀死系统调用,在我的解决方案中,kill系统调用不会唤醒Receiver进程。为了传递两个孩子的PID,我使用了两个不同的文件,每个文件对应一个PID。 当发送者工作时,同时接收者进入暂停(),在发送者结束时,当我杀死(cpid2,SIGUSR1)时,接收者保持暂停()... 你能帮助我吗? 代码在这里:http://pastebin.com/Prxq9E2G

2 个答案:

答案 0 :(得分:1)

我认为您只需要使用系统调用

为所用信号设置信号处理程序
signal(SIGUSR1, signalhandler);

并且信号处理函数可以简单地包含相同的代码(如下面的函数):

void signalhandler() {
    signal(SIGUSR1, signalhandler);
}

答案 1 :(得分:0)

您的代码存在很多问题,至少:

  • message指向长度为1个字节的数组,并尝试在其中填充最多80个字符(fgets)...
  • message无法在进程间共享,每个forked子进程都有自己的内存副本,即自己的message数组与其他数组不同流程。
  • 当您尝试阅读时,您无法确保将pid写入您的pid文件。流程可以以任何方式安排......