2013-05-02 2 views
0

에 파이프를 구현 :나는 C에서 파이프를 구현하려고하지만 약간의 문제가 C

:이있는 경우 예를 들어

void commandeTube(char * c1, char * c2) { 
    int c1toc2[2]; 
    int c2toPere[2]; 
    pid_t pidc1, pidc2; 
    if(pipe(c1toc2) && pipe(c2toPere)) { 
     perror("Erreur"); 
     errno=0; 
     return ; 
    } 
    pidc2 = fork(); 
    if(pidc2 != 0) { 
     pidc1=fork(); 
     if(pidc1!=0) { 

      int status; 
      waitpid(pidc1,&status,0); 
      char buffer[1024]={0}; 
      int n; 
      while((n=read(c2toPere[0],buffer,1024))==1024) 
       write(1,buffer,n); 
      write(1,buffer,n); 


     } 
     else if(pidc1==0){ 
      write(STDOUT_FILENO,"C1\n",3); 
      /*On est dans C1*/ 
      close(c1toc2[0]); 
      dup2(c1toc2[1],1); 
      char * argc1[10]; 
      constructTab(c1,argc1); 
      write(STDOUT_FILENO,"C1 exe\n",7); 
      if(execvp(argc1[0],argc1)==-1) { 
       perror("Erreur execlp"); 
       errno=0; 
       return; 
      } 
      freeTab(argc1); 
      write(STDOUT_FILENO,"C1 fin\n",7); 
     } 

    } 
    else { 
      /*C2*/ 
      write(STDOUT_FILENO,"C2\n",3); 
      int stat; 
      char * argc2[10]; 
      constructTab(c2,argc2); 
      close(c1toc2[1]); 
      /*close(c2toPere[0]);*/ 
      dup2(c1toc2[0],STDIN_FILENO); 
      /*dup2(c2toPere[1],1);*/ 
      write(STDOUT_FILENO,"C2 exe\n",7); 
      if(execvp(argc2[0],argc2)==-1) { 
       perror("Erreur execlp"); 
       errno=0; 
       return; 
      } 
      freeTab(argc2); 
      write(STDOUT_FILENO,"C2 fin\n",7); 

    } 
} 

: 여기

나의 기능입니다

cmd1 | CMD2는

주요 과정은 어린이 2 명, cmd2에 대한 cmd1에 대한 다른 하나를 만듭니다. cmd1의 출력은 cmd2의 입력으로 재 지정됩니다. |

LS를 : 내 문제는 cmd2cmd1 전에 실행된다, 그래서 입력하면 wc

예를 들어 wc가 먼저 실행됩니다. 내 쉘에서 볼 수 있습니다.

C2 
C1 
C2 exe 

C2를 실행하기 전에 C1을 완전히 실행하는 방법은 무엇입니까? 이전에, 나는 waitpid(c1,...,..);으로 c2의 c1 아이를 만들려고했으나 같은 결과가있었습니다.

답변

0

첫 번째 명령의 출력을 두 번째 명령의 입력으로 리디렉션하려면 man 2 pipe을 읽는 것이 좋을 수 있습니다. 올바른 예를 들어 보겠습니다.

http://linux.die.net/man/2/pipe

0

코드는 나를 위해 작동하지만 C1 exe 인 메시지가 파이프로 연결되고 있었다. 나는 LS의 화장실로 실행할 때 그때

C2 
C1 
C1 exe 
C2 exe 
    193  194 1502 

을보고, STDERR_FILENO에 모든 STDOUT_FILENO을 변경했습니다.

관련 문제