父母和孩子之间的C双向管道

时间:2013-09-17 02:14:26

标签: c unix fork pipe

我有一个包含(其中包括)两组文件描述符的结构。

int (*pfdsParent)[2], (*pfdsChild)[2]

当我在我的struct中使用malloc其他数组时,它们被分配了内存,

s -> pfdsParent = malloc(3 * x * sizeof(int))
s -> pfdsChild = malloc(3 * x * sizeof(int)) 

struct包含文件中每一行的信息,该信息用于为文件中的每一行创建一个进程。子进程执行一个程序,管道需要是双向的(或者更确切地说,每个管道需要两个管道)。我的第一个问题是关于“分配”这些文件描述符的值。在示例中,我看到你只是做了类似的事情,

 int pfds[2]; 
 pipe(pfds); 

所以我认为你不需要初始化这些描述符。但是如果我在循环中试图访问,

(s -> pfdsChild[i][0]) 

我是否知道我正在谈论我正在创造的第一个过程中孩子的标准?我没有在这些行上得到任何错误/警告,但它让我感到困惑,如果我从未编入索引它会如何工作。无论如何,第二个问题是关于父母和孩子之间的沟通。我(有限)对管道的理解使我开始了这个功能,

int pipeFork(struct *s, int* Length){

    int i, status;

    for(i = 0; i < *Length; i++){

        char *args[] = {(s-> Name[i]), (s-> Args[i]), NULL};

        pipe(s-> pfdsParent[i]);
        pipe(s-> pfdsChild[i]);

        if(!fork()){ // child 
            // parent stdout goes to child stdin (read from child) 
            dup2((s-> pfdsChild[i][0]), (s-> pfdsParent[i][1])); 
            close((s-> pfdsParent[i][0])); 
            close((s-> pfdsChild[i][1])); 

            // child stdout goes to parents stdin (read from parent)
            dup2((s-> pfdsParent[i][0]), (s-> pfdsChild[i][1])); 
            close((s-> pfdsParent[i][1]));
            close((s-> pfdsChild[i][0])); 

            execvp((s-> Name[i]), args);

         } else{ // parent 

            dup2((s-> pfdsChild[i][0]), (s-> pfdsParent[i][1])); 
            close((s-> pfdsParent[i][0])); 
            close((s-> pfdsChild[i][1]));

            dup2((s-> pfdsParent[i][0]), (s-> pfdsChild[i][1])); 
            close((s-> pfdsParent[i][1]));
            close((s-> pfdsChild[i][0])); 


            write(s-> pfdsParent[i][1], "test", sizeof("test")); 
            wait(&status); \\ see if child gets it 
    }


return 0; 

}

孩子执行的程序试图做,

read(stdin, buffer, sizeof(buffer)); 
printf("I have %s\n", buffer); 
printf("Child done!\n); 

但它没有从标准输入的父级接收字符串。我所做的事情有什么特别的错吗?最终目标是让我能够从孩子打印并让父母阅读它,并从父母那里向孩子打印东西。任何帮助表示赞赏。

0 个答案:

没有答案