c多叉和管道

时间:2013-12-09 21:03:31

标签: c fork pipe

我的课程代码出现问题我必须在不同的进程中运行不同的函数,然后将结果传回父级并显示它。我遇到了问题所以我现在正试图通过基本程序来理解,但我仍然遇到错误。

首先我无法得到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);
    }
}

1 个答案:

答案 0 :(得分:2)

    }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]);         
    }

按照惯例,[0]管道元素用于读取,[1]元素用于写入。您正在写[0]然后在父级中读取[0]。解决这个问题,你很高兴。

if(getpid() > 0){

以上是毫无意义的。 getpid() 始终将大于0,因为每个进程的pid大于零。您希望对从[{1}}返回的pid [i]中存储的pid执行此测试。在这种情况下,这也是不必要的,因为您的孩子退出,所以只有父母才会到达此代码。

始终,始终检查您的退货代码。如果你有,你会直接看到你的管道写入失败,你的管道读取返回0。