1

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

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

当我 malloc 结构中的其他数组时,它们被分配了内存,

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

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

 int pfds[2]; 
 pipe(pfds); 

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

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

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

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

但它不会在其标准输入处接收来自父级的字符串。我所做的事情有什么严重的错误吗?最终目标是让我能够从孩子那里打印并让父母阅读它,然后从父母那里打印东西给孩子。任何帮助表示赞赏。

4

0 回答 0