我正在编写一个程序,用于两个子进程之间的同步。请求是:
使用C语言实现并发程序,创建两个子项:发送者和接收者。 发送器循环从标准输入读取字符串并准备文件中单行的“消息”,然后它向接收器发信号通知消息已准备好,它等待接收器发出字符串已被处理的信号(简单地说转换为大写)并打印处理过的字符串。 接收器循环等待发送器的信号,以大写形式转换它,并向发送器发信号通知可以打印该字符串。 父进程在两个进程上等待结束,当发送的消息是字符串“end”时终止。然后主进程必须打印已发送消息的数量。
因为同步我必须只使用信号,杀死系统调用,在我的解决方案中,kill系统调用不会唤醒Receiver进程。为了传递两个孩子的PID,我使用了两个不同的文件,每个文件对应一个PID。 当发送者工作时,同时接收者进入暂停(),在发送者结束时,当我杀死(cpid2,SIGUSR1)时,接收者保持暂停()... 你能帮助我吗? 代码在这里:http://pastebin.com/Prxq9E2G
答案 0 :(得分:1)
我认为您只需要使用系统调用
为所用信号设置信号处理程序signal(SIGUSR1, signalhandler);
并且信号处理函数可以简单地包含相同的代码(如下面的函数):
void signalhandler() {
signal(SIGUSR1, signalhandler);
}
答案 1 :(得分:0)
您的代码存在很多问题,至少:
message
指向长度为1个字节的数组,并尝试在其中填充最多80个字符(fgets
)... message
无法在进程间共享,每个forked
子进程都有自己的内存副本,即自己的message
数组与其他数组不同流程。