我有一个包含(其中包括)两组文件描述符的结构。
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);
但它没有从标准输入的父级接收字符串。我所做的事情有什么特别的错吗?最终目标是让我能够从孩子打印并让父母阅读它,并从父母那里向孩子打印东西。任何帮助表示赞赏。