2011-09-29 4 views
0

나는이 질문이 많이 제기되지만 나는 아직도 내 문제를 해결하는 방법에 관해서는 정말로 혼란 스럽다. 여러 파이프의 가능성에 대한 명령 줄 입력을 처리하는 코드를 작성하려고 시도했습니다. 그러나 실행이 올바르게 작동하지 않더라도 실패하고 코드가 잘못되었습니다. 버그는 일단 아이들을 갈라 놓았습니다. 첫 번째 명령이 실행 된 후 파이프가가는 다음 명령으로 갈 수 없습니다. 잘못된 파일 설명자를 잡지 않고 파이프의 다음 명령으로 이동하려면 어떻게합니까? 다음은 코드 덩어리입니다.리눅스에서 반복적 인 파이핑 구현

 a = 0; 
     while (a < cmdnum) 
     { 
     pid[a] = fork(); 
     if(pid[a] == 0) 
     { 
     if(a == 0) 
     { 

      close(1); 
      dup(p1_to_pn[a][1]); 
      for(k = 0; k < nump; k++) 
      { 
       close(p1_to_pn[k][0]); 
       close(p1_to_pn[k][1]); 
      } 

      args = tokenize(cmd[a]); 
      execv(args[0], args); 
     } 
     else if (a == (cmdnum-1)) 
     { 

      close(0); 
      dup(p1_to_pn[a][0]); 
      for(k = 0; k < nump; k++) 
      { 
       close(p1_to_pn[k][0]); 
       close(p1_to_pn[k][1]); 
      } 
      args = tokenize(cmd[a]); 

      i = execv(args[0], args); 
     } 
     else 
     { 

      close(0); 
      dup(p1_to_pn[a][0]); 
      close(1); 
      dup(p1_to_pn[a][1]); 
      for(k = 0; k < nump; k ++) 
      { 
       close(p1_to_pn[k][0]); 
       close(p1_to_pn[k][1]); 
      } 
      args = tokenize(cmd[a]); 

      execv(args[0], args); 
     } 
    } 
    a++; 
} 
+0

명확히하기 위해 셸 (또는 셸처럼 작동하는 무언가)을 작성하고 있습니까? –

+0

쉘 유형, 예 : – GFXGunblade

답변

1

실수로 "다음"명령으로 이동해야한다고 생각합니다. 모두 시작하십시오.

여기 A | B | C

부모 프로세스가 명령 행을 읽고 같은 파이프 라인에 대한 기본적인 생각입니다. 각각의 새로운 명령에 대해 새로운 프로세스를 포크하고 결국 실행하게됩니다. 부모 프로세스는 이미 fd 0,1,2 open (STDIN, STDOUT, 그리고 STDERR)을 가지고있다. 파이프를 쳤을 때 pipe (2)와 dup (2) 시스템 호출을 사용하여 새로운 fd를 만든다. 다음 프로세스를 포크하십시오.

모든 fd 조작은 상위 프로세스에서 발생합니다.

+0

아, 와우, 나는 그것을 놓쳤다는 것을 믿을 수 없다. 고마워요. – GFXGunblade

+0

아, 할 수 있어요. 나는 시스템 프로그래밍 과정에서 대부분의 하룻밤을 대학원에서 보냈다. –

+0

pipe 함수에 대해 잘 모르겠다. pipe (2)를 호출하면 두 개의 새로운 파일 설명자가 생성되지 않느냐? 두 번째 명령의 출력을 세 번째 입력으로 읽는 두 파이프 호출을 어떻게할까요? 세 번째 명령의 입력 파일 설명자가 다른 위치를 가리 키지 않습니까? – GFXGunblade

관련 문제