【发布时间】:2016-03-25 03:20:51
【问题描述】:
我正在尝试实现这种情况:
两个并行进程通过管道连接到tr /a-z/ /A-Z/,最后tr /a-z/ /A-Z/ 进程连接到标准输出。
我编写了这个程序来尝试实现我的目标:
#include<stdio.h>
#include<unistd.h>
#include<wait.h>
int main()
{
int dummy;
int fd[2];
int i;
char* lsargs[] = {"/bin/ls", "-l", NULL};
char* lsargs2[] = {"cat", "/etc/group", NULL};
char* lsargs3[] = {"tr", "/a-z/", "/A-Z/", NULL};
char** am[] = {lsargs, lsargs2, lsargs3};
pipe(fd);
for ( i = 0 ; i < 3 ; i++ )
{
pid_t pid = fork();
if ( pid == 0 )
{
if ( i != 2 ) // ls -l & cat
{
// 0 -> stdin, 1 -> pipe write end
close(fd[0]);
dup2(fd[1], 1);
close(fd[1]);
execvp(am[i][0], am[i]);
}
else //TR AZ AZ
{
// 0 -> pipe read end 1 -> stdout
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
execvp(am[i][0], am[i]);
}
break;
}
else{
wait(&dummy);
}
}
return 0;
}
我得到了正确的输出,但我的程序没有终止,它仍然想要输入。你能帮我理解原因吗?
【问题讨论】:
-
你在 fork 第一个进程后等待。你的循环太聪明了,我建议你展开循环
-
@AnttiHaapala 你有什么建议?我知道使用循环是没有意义的,我将它用于特殊目的。
-
不要使用
for编写代码以使其重复;然后您可以识别可以重复的部分以及原因。现在你的父母将wait让第一个孩子退出之前下一个孩子甚至被分叉,执行也没有让它的管道运行。
标签: c linux pipe fork system-calls