2015-03-31 48 views
0

嗨,我有以下问题,我必须创建一个程序来执行这些Linux命令ls –la | sort | wc –l但在我的代码中,我只能读取这个命令中的两个,是否可以与此同时帮助我?Pipes&exec&C

int main(){ 
    pid_t pids[3]; 
    int dados[2],dados2[2],i; 

    if(pipe(dados) == -1 && pipe(dados2) == -1){ 
     perror("pipe failed"); 
     exit(1); 
    } 

    for(i=0;i<3;i++){ 
     pids[i] = fork(); 
     if(pids[i] == 0){ 
      if(i==0){ 
      close(dados[0]); 
      dup2(dados[1],1); 
      close(dados[1]); 

      execlp("ls","ls","-la",NULL); 
      perror("exec failed"); 
      exit(-1); 
     } 
     if(i==1){ 
      close(dados[1]); 
      dup2(dados[0],0); 
      close(dados[0]); 


      close(dados2[0]); 
      dup2(dados2[1],1); 
      close(dados2[1]); 

      execlp("sort","sort",NULL); 
      perror("exec failed"); 
      exit(-1); 
     }else{ 
      close(dados2[1]); 
      dup2(dados2[0],0); 
      close(dados2[0]); 
      printf("aaaaaaaaaaaaaaaaaa"); 
      execlp("wc","wc","-l",NULL); 
      perror("exec failed"); 
      exit(-1); 
     } 
    } 
} 

/* Pai tem de fechar a sua copia da extremidade de escrita 
    para a leitura do sort desbloquear */ 
close(dados[1]); 
close(dados2[0]); 
for(i=0;i<3;i++){ 
    wait(NULL); 
} 

return 0; 

}

我不明白错过这个

+0

已标记的Linux – 2015-03-31 01:14:13

回答

0

什么吸引我的眼睛立刻是

-if(pipe(dados) == -1 && pipe(dados2) == -1){ 
+if(pipe(dados) == -1 || pipe(dados2) == -1){ 

    perror("pipe failed"); 
    exit(1); 
} 

父的pid只需要读取的最后一个命令的输出,所以父母需要关闭所有其他管道末端。子进程需要关闭stdin/stdout和dup2()管道描述符以将它们绑定到stdin/stdout,然后执行exec()。对于管道来说,关闭流程中不需要的管道端非常重要。请参阅http://linux.die.net/man/2/pipe

目前我没有linux box beneith me,所以我不能编写和测试linux代码。

我对你的总结是: - 父母从最后一个管道读取(在链中的最后一个进程的标准输出) - 所有其他孩子的需要关闭()的标准输入/输出,DUP2()右pipeend,关闭所有不需要的管道(请记住关闭dup2()源,因为它是一个fd)然后执行exec。

下面是我如何创建管道并重新绑定fds的示例。请注意,在管道(int fds [2])处,索引1是管道的写入端,索引0是管道的读取端。因此,你需要

问候 乔治

编辑:我建议你这本书 “Linux的编程接口:一个Linux和UNIX系统编程手册” ISBN-13:978-1593272203