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);
}
我正在编写一个用于在两个 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);
}