无法让子进程相互通信
Trouble getting child processes to communicate with each other
我是 linux 编程新手。我正在尝试生成两个子进程并通过管道连接它们。生成子进程应该生成随机数,另一个子进程应该 运行 一个二进制文件,它采用这两个数字并找到它们的最大公约数。该二进制文件已经可以很好地与 stdin 配合使用,因此我试图将其重定向以读取管道的末端。类似地,我通过将标准输出连接到管道写入端的生成过程来做到这一点。
但是我觉得我没有把它连接好,因为没有输出。任何帮助将不胜感激!
我没有在网上找到很多资料,所以建议这些也会有很大帮助。谢谢
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define exec_path "nsd"
void create_pipe(int *proc_pipe);
int create_proc();
void sig_handler(int sig);
int main() {
int proc_pipe[2];
pid_t gen_proc;
pid_t nsd_proc;
int proc_stat;
create_pipe(proc_pipe);
gen_proc = create_proc();
if (gen_proc == 0) {
// child exec
struct sigaction act;
act.sa_handler = &sig_handler;
close(proc_pipe[0]);
dup2(proc_pipe[1], 1);
close(proc_pipe[1]);
while (1) {
printf("%d %d\n", rand() % 4096, rand() % 4096);
sleep(1);
if (sigaction(SIGTERM, &act, NULL) == -1) exit(2);
}
} else {
nsd_proc = create_proc();
if (nsd_proc == 0) {
// child exec
close(proc_pipe[1]);
dup2(proc_pipe[0], 0);
close(proc_pipe[0]);
execl(exec_path, "nsd", (char *) NULL);
} else {
close(proc_pipe[0]);
close(proc_pipe[1]);
sleep(5);
kill(gen_proc, SIGTERM);
wait(&proc_stat);
if (proc_stat != 0) {
perror("ERROR");
return 1;
} else {
printf("OK\n");
return 0;
}
}
}
}
void sig_handler(int sig) {
if (sig == SIGTERM) {
perror("GEN TERMINATED");
exit(0);
}
}
pid_t create_proc() {
pid_t pid = fork();
if (pid == -1) {
perror("error forking new process");
exit(2);
}
return pid;
}
void create_pipe(int *proc_pipe) {
if (pipe(proc_pipe) == -1) {
perror("failed to create pipe");
exit(2);
}
}
printf
在填充缓冲区之前不会调用 write。您没有给 child 足够的时间来填充该缓冲区。在 child 进入休眠之前添加 fflush(stdout)
,以便将一些数据实际写入管道。
我是 linux 编程新手。我正在尝试生成两个子进程并通过管道连接它们。生成子进程应该生成随机数,另一个子进程应该 运行 一个二进制文件,它采用这两个数字并找到它们的最大公约数。该二进制文件已经可以很好地与 stdin 配合使用,因此我试图将其重定向以读取管道的末端。类似地,我通过将标准输出连接到管道写入端的生成过程来做到这一点。
但是我觉得我没有把它连接好,因为没有输出。任何帮助将不胜感激!
我没有在网上找到很多资料,所以建议这些也会有很大帮助。谢谢
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define exec_path "nsd"
void create_pipe(int *proc_pipe);
int create_proc();
void sig_handler(int sig);
int main() {
int proc_pipe[2];
pid_t gen_proc;
pid_t nsd_proc;
int proc_stat;
create_pipe(proc_pipe);
gen_proc = create_proc();
if (gen_proc == 0) {
// child exec
struct sigaction act;
act.sa_handler = &sig_handler;
close(proc_pipe[0]);
dup2(proc_pipe[1], 1);
close(proc_pipe[1]);
while (1) {
printf("%d %d\n", rand() % 4096, rand() % 4096);
sleep(1);
if (sigaction(SIGTERM, &act, NULL) == -1) exit(2);
}
} else {
nsd_proc = create_proc();
if (nsd_proc == 0) {
// child exec
close(proc_pipe[1]);
dup2(proc_pipe[0], 0);
close(proc_pipe[0]);
execl(exec_path, "nsd", (char *) NULL);
} else {
close(proc_pipe[0]);
close(proc_pipe[1]);
sleep(5);
kill(gen_proc, SIGTERM);
wait(&proc_stat);
if (proc_stat != 0) {
perror("ERROR");
return 1;
} else {
printf("OK\n");
return 0;
}
}
}
}
void sig_handler(int sig) {
if (sig == SIGTERM) {
perror("GEN TERMINATED");
exit(0);
}
}
pid_t create_proc() {
pid_t pid = fork();
if (pid == -1) {
perror("error forking new process");
exit(2);
}
return pid;
}
void create_pipe(int *proc_pipe) {
if (pipe(proc_pipe) == -1) {
perror("failed to create pipe");
exit(2);
}
}
printf
在填充缓冲区之前不会调用 write。您没有给 child 足够的时间来填充该缓冲区。在 child 进入休眠之前添加 fflush(stdout)
,以便将一些数据实际写入管道。