2
可以说我的程序中我想执行两个子进程,一个执行“ls -al”命令,然后将其传送到“wc”命令并在终端上显示输出。我怎样才能做到这一点使用管道文件描述符到目前为止,我写的代码:一个例子是大大有益的使用fork和dup的Unix管道
int main(int argc, char *argv[]) {
int pipefd[2];
int pipefd2[2];
pipe(pipefd2);
if ((fork()) == 0) {
dup2(pipefd2[1],STDOUT_FILENO);
close(pipefd2[0]);
close(pipefd2[1]);
execl("ls", "ls","-al", NULL);
exit(EXIT_FAILURE);
}
if ((fork()) == 0){
dup2(pipefd2[0],STDIN_FILENO);
close(pipefd2[0]);
close(pipefd2[1]);
execl("/usr/bin/wc","wc",NULL);
exit(EXIT_FAILURE);
}
close(pipefd[0]);
close(pipefd[1]);
close(pipefd2[0]);
close(pipefd2[1]);
}
关闭一个'dup''d文件描述符关闭另一个是**不是**。关闭只是删除打开文件的一个句柄。文件本身在所有的'dup''d文件描述符都关闭之前不会关闭。 – caf 2010-04-07 07:42:10
哦,你*应该关闭父文件中的'pipefd'文件描述符 - 它不需要它们(并且直到父文件在写入结束时关闭它的句柄,阅读子文件才会看到文件结束) 。同样,'close()'只能删除你传递它的句柄,直到* every *进程中的所有句柄都关闭,底层管道才会关闭。 – caf 2010-04-07 07:49:35
你是多么的正确,咖啡,更正,谢谢。 – msw 2010-04-07 12:33:42