无法让子进程相互通信

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),以便将一些数据实际写入管道。