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

C - kill system call doesn't wake up a process

我正在编写一个用于在两个 child 进程之间进行同步的程序。要求是:

用 C 语言实现一个并发程序,创建两个 children:一个发送者和一个接收者。 发送方循环从标准输入中读取一个字符串并准备文件中单行的“消息”,然后它向接收方发出消息准备就绪的信号,它等待来自接收方的信号表明该字符串已被处理(简单地说转换为大写)并打印处理后的字符串。 接收方循环等待发送方的信号,将其转换为大写,并向发送方发出可以打印字符串的信号。 parent 进程等待两个进程的结束,当发送的消息是字符串“end”时终止。然后主进程必须打印已发送消息的数量。

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

你的代码有很多问题,至少:

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

我认为您只需要使用系统调用为所使用的信号设置信号处理程序

signal(SIGUSR1, signalhandler);

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

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