2012-11-16 44 views
0

在任务中,我们被要求实施管道。我能够这样做,但我遇到的问题是,当我输入命令时,我输入命令在基本外壳实施中配管

ls | grep的 'a.out的'

然后输出

的a.out

的a.out

但是当我做

LS | wc

输出只出现一次。任何人都可以指出代码中的错误吗?代码如下:

void execute_pipe(char **argv,char **args) 
{ 

int pfds[2]; 
pid_t pid,pid2; 
int status,status2; 
pipe(pfds); 
if ((pid = fork()) < 0) {  
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
} 
if ((pid2 = fork()) < 0) {  
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
} 
if (pid==0) { 
    close(1);  
    dup(pfds[1]); 
    close(pfds[0]); 
close(pfds[1]); 
    if(execvp(argv[0],argv)<0){ 
     printf("**error in exec"); 
    } 
} 
else if(pid2==0){ 

    close(0);  
    dup(pfds[0]); 
    close(pfds[1]); 
close(pfds[0]); 
    if(execvp(args[0],args)<0){ 
    printf("**error in exec"); 

} 
} 
else{ 
    close(pfds[0]); 
    close(pfds[1]); 
    while (wait(&status) != pid) ; 
    while (wait(&status2) != pid2) ; 
     } 
} 

我很确定没有杂散打印,并且目录中只有一个a.out。

回答

1

您运行第二个fork都是父进程和第一个子进程。如果pid非零,则只应执行第二个分支。

+0

作品,谢谢:D – user1828941