c多叉管

c多叉管,c,fork,pipe,C,Fork,Pipe,我的课程代码有问题,我必须在不同的进程中运行不同的函数,然后通过管道将结果返回给家长并显示出来。我遇到了一些问题,所以我现在正试图用一个基本的程序来理解它,但是我仍然会出错 首先,我无法获取pid=wait(&status)它一直说pid是未定义的,当我四处走动时,我转到管道上,但信息似乎没有到达家长 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait

我的课程代码有问题,我必须在不同的进程中运行不同的函数,然后通过管道将结果返回给家长并显示出来。我遇到了一些问题,所以我现在正试图用一个基本的程序来理解它,但是我仍然会出错

首先,我无法获取
pid=wait(&status)它一直说pid是未定义的,当我四处走动时,我转到管道上,但信息似乎没有到达家长

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

#define PROCS 5

int main(void){
    int pipes[PROCS][2];
    pid_t ret[PROCS];
    int status = 0;
    int i;
    char msg[PROCS][100];

    for(i = 0;i < PROCS; i++){

    //create pipes
        //create pipes
        if (pipe(pipes[i]) != 0) { // Create a new pipe.
            printf("Could not create new pipe %d", i);
            exit(1);
        }

        if ((ret[i] = fork()) == -1) { 
            printf("Could not fork() new process %d\n", i);
            exit(1);
        }else if (ret[i] == 0) {//if child
            close(pipes[i][1]);
            char string[] = "child process"; //%d - process id = %d\n", i, getpid();
            write(pipes[i][0], string, 25);
            exit(0);
        }
    }
    if(getpid() > 0){
        for(i = 0; i < PROCS; i++) {
            wait(&status);
        }
        for(i = 0; i < PROCS; i++) {
            close(pipes[i][1]);
            read(pipes[i][0], &msg[i], 100);
            close(pipes[i][0]);         
        }
        printf("test 1 : %s\n", msg[0]);
        printf("test 2 : %s\n", msg[1]);
        printf("test 3 : %s\n", msg[2]);
        printf("parent process - process id = %d\n", getpid());     
        exit(0);
    }
}
#包括
#包括
#包括
#包括
#定义过程5
内部主(空){
内部管道[PROCS][2];
pid_t ret[PROCS];
int status=0;
int i;
char msg[PROCS][100];
对于(i=0;i0){
对于(i=0;i
上述内容毫无意义。
getpid()
总是大于0,因为每个进程的pid都大于零。您希望对存储在ret[i]中的
fork
返回的pid执行此测试。在这种情况下,这也是不必要的,因为您的孩子将退出,因此无论如何只有家长才能访问此代码


总是,总是,总是检查您的返回代码。如果您有,您会立即看到管道写入失败,管道读取返回0。

thx工作正常,thx指出getpid错误,我没有意识到这一点
    }else if (ret[i] == 0) {//if child
        close(pipes[i][1]);  <== (1)
        char string[] = "child process"; //%d - process id = %d\n", i, getpid();
        write(pipes[i][0], string, 25);  <== (2)
        exit(0);

    //.....

    for(i = 0; i < PROCS; i++) {
        close(pipes[i][1]);
        read(pipes[i][0], &msg[i], 100); <-- (3)
        close(pipes[i][0]);         
    }
if(getpid() > 0){