【发布时间】:2020-09-12 05:04:22
【问题描述】:
我希望我的主进程创建一个管道和一个子进程,而不是子进程向管道发送一个数字(以 0 开头)并向父进程发送信号,父进程从管道读取,如果数字小于 5,则打印它,将其增加 1 并通过管道和信号将其传回给孩子。
我的问题是,我没有设法将它们同步为“乒乓球”。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void parentSignal(int signum);
void childSignal(int signum);
int pfd[2];
int fid, cid;
int val = 0;
void parentSignal(int signum){
sleep(0);
read(pfd[0], &val, sizeof(val));
printf("my pid is: %d, X = %d\n",fid, val); val++;
if (val==6) {
puts("Parent is going to be terminated");
kill(cid, SIGTERM);
kill(fid, SIGTERM);
}
}
void childSignal(int signum){
sleep(0);
read(pfd[0], &val, sizeof(val));
printf("my pid is: %d, Y = %d\n",cid, val); val++;
if (val==6) {
puts("Childd is going to be terminated");
kill(cid, SIGTERM);
kill(fid, SIGTERM);
}
}
int main(){
if (pipe(pfd) < 0){ printf("Pipe Failed"); }
pid_t pid = fork();
if (pid == 0) {// We are in child
fid=getppid();
signal(SIGUSR1, parentSignal);
write(pfd[1], &val, sizeof(val));
kill(fid, SIGUSR1);
while (1){
sleep(0);
write(pfd[1], &val, sizeof(val));
kill (fid, SIGUSR1);
}
}
else if (pid > 0) {// We are in parent
cid = pid;
signal(SIGUSR1, childSignal);
while (1){
sleep(0);
write(pfd[1], &val, sizeof(val));
kill (cid, SIGUSR1);
}
}
else { puts("Fork Failed !!"); }
close(pfd[0]);
close(pfd[1]);
return 0;
}
有人可以帮我修复代码,因此输出将是:
- 0
- 1
- 2
- 3
- 4
- 5
- 孩子将被终止
- 父母将是 终止
【问题讨论】:
-
您不应该使用两个管道吗?一个用于父写/子读,另一个用于通信?只是问,没有测试任何一种方式......
-
我不认为这是我的问题..
-
我终于试过了...不需要 2 个管道 :) 见 pastebin.com/QLQEgECk
-
真是个好人。但我需要通过“SIGUSR1”做“乒乓球”。
标签: c linux process signals ipc