2014-11-03 4 views
0

I 3 개 프로세스 파이프 체인 더한 전류 프로그램되도록 만들려고하고 유닉스 체인의 지연 :파이프

1 - Exec에서 P1 및 P2

(3)의 입력 (P1)의 출력을 보내 - 표준 출력 P3에 표시 출력

5 - - P3

입력 전류/주/드라이버 프로그램의 패스 표준 입력

I P3

(4)의 입력에 출력 P2 보내기 2 개의 파이프를 사용하고 있습니다. 작업 # 5의 경우 주 프로그램은 stdin에서 읽고 P3이 읽는 파이프에 씁니다.

저는 서로 통신하는 프로세스를 관리했습니다. 하지만 P1이 쓰고 P2가 STDIN에서이 쓰기를 감지하면 P2가 쓰기를 감지하고 처음에 많은 P1 쓰기를 놓치기 전에 P1이 수백 번 작성되었을 수 있다는 점에서 큰 지연이 있다는 것을 알게되었습니다. 나는 P2가 사실상 정각에 시작되었다는 인쇄 메시지를 통해 확인했다. 그러나 그것은 시간상의 입력을 감지하거나 읽지 않는다. (파이썬 스크립트 루핑 : "for sys.stdin :")

여기에 내 코드입니다 : 내가 발견

int pipe1[2]; 
int pipe2[2]; 
if (pipe(pipe1) < 0 || pipe(pipe2) < 0 ) 
{ 
    perror("Error: pipe"); 
} 


pid_t procIDC = fork(); 
if (procIDC == 0) 
{  
    dup2(pipe2[0], 0); 
    execv("procC", argv);   
} 
else 
{  
    pid_t procIDB ; 
    procIDB = fork(); 

    if (procIDB == 0) 
    {  
     dup2(pipe1[0], 0); 
     dup2(pipe2[1], 1); 


     if (execl("/usr/bin/python", "/usr/bin/python", "./test.py", (char *)NULL) < 0) 
     { 
      perror("execl"); return 0; 
     } 
    } 
    else 
    {   
     pid_t procIDA = fork(); 
     if (procIDA ==0) 
     {  
      dup2(pipe1[1], 1); 
      execv("proc1", argv);  
     } 
     else 
     {     
      dup2(pipe2[1], 1); 

      //print any input so it sends to p3 
      ssize_t read; 
      char *inputLine = NULL; 
      size_t len = 0;   
      while ((read = getline(&inputLine, &len, stdin)) != -1) 
      { 
       printf(inputLine); 
      }    
     } 
    } 

답변

0

P2의 STDIN에 입력 버퍼링이 있습니다.

1

은 P1이 쓰고시 사이에 큰 지연이있다는 P2가 STDIN에서이 쓰기를 감지 할 때

예. 귀하의 질문은 아마도 "왜 지연이 있습니까"입니까?

답변 : stdio (대부분의 프로그램에서 사용됨)은 출력이 파이프로 연결될 때 완전 버퍼 출력 을 사용합니다.

버퍼링을 방지하려면 fflush 또는 setvbuf을 사용하십시오.

일부 추가 읽기 here.

사실, FFLUSH 분명히 당신은 우리에게 그것에 fflush와 쓰기 프로그램을 보여주지 않았다

쓰기 프로그램에서 수행되고있다. 가지고 있었다면 실수를 지적 할 수 있습니다 (fflush 도움이 될 경우 올바르게 수행 할 수 있음).

어쨌든, 무슨 일이 일어나고 있는지 볼 수있는 한 가지 방법은 strace -p <pid-of-writer>를 실행하고 작가가 실제로 write(2) 콜을 실행 즉시 후, 독자가 입력을 취득하는 것을 관찰하는 것입니다. 그것은 지연을 야기하는 작가에게 실제로 버퍼링된다는 것을 증명할 것입니다.

이 :

setbuf(stdout, NULL);

버퍼링을 해제하지 않습니다. setvbuf (또는 fflush)으로 전화해야합니다.

+0

실제로 시도했지만 도움이되지 않습니다. 또한 printf 및 플러시 후에 후속 인쇄 전에 잠자기 모드로 설정하면 궁극적으로 P2로 픽업됩니다. 그러나 대신 P2가 마지막으로 읽기를 감지하는 시간 간격 만 증가 시켰습니다. 이해가 안돼! – cppNoob

+0

@cppNoob 당신은 우리에게 * 독서 * 프로그램을 보여줬을뿐입니다. * fooush를 * it *에 추가하는 것은 아무런 차이를 만들지 않을 것입니다 : 지연은 * writing * one에서 일어나고 있습니다. 그리고 * 물론 느린 프로그램에 잠을 자면 속도가 느려집니다. –

+0

사실, fflush는 분명히 쓰기 프로그램에서 수행되고 있기 때문에 잠시 후 – cppNoob