2017-05-23 8 views
0

파이프, 부모 프로세스 및 하위 프로세스가 있습니다. 부모는 파일에서 일부 데이터를 읽어서 파이프에 넣은 후 자식이 모든 데이터를 읽어야합니다. 내 문제는 이것입니다 : 부모님이 데이터를 읽고 자식이 파이프에서 데이터를받습니다. 그러나 끝까지 도달하면 프로세스가 종료되고 while 명령을 종료 한 후에는 결과가 출력되지 않습니다. ABC을 출력은 다음과 같습니다 :파이프에서 읽을 때 프로세스가 종료됩니다.

int main(void) 
{ 
    int inputFile, channel[2], PID; 
    if(-1 == pipe(channel)) 
    { 
     perror("Eroare"); 
     return 0; 
    } 
    if(-1 == (inputFile = open("data.txt", O_RDONLY))) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(-1 == (PID = fork())) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(PID != 0) 
    { 
     char buffer; 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     while(1 == read(inputFile, &buffer, 1)) 
      write(channel[1], &buffer, 1); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
    } 
    else 
    { 
     char buffer; 
     while(1 == read(channel[0], &buffer, 1)) 
      printf("%c\n", buffer); 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
     printf("Should output this");  
    } 
    return 0; 
} 

내 데이터 파일 문자열을 포함

+ 2
A 
B 
C 

여분의 빈 줄

아직도 그 파일 기술자에 대한 다른 작가가있는 경우

답변

1

블록을 읽습니다. 부모가 가지고있는 파일 디스크립터를 닫는 동안, 자식 파일 디스크립터는 여전히 열려 있고, 읽기가 끝난 후에 만 ​​닫히게된다. 그러나 자식 프로세스 자체는 작가로 간주되기 때문에 읽기는 차단 될 것이다. 영원히

int main(void) 
{ 
    int inputFile, channel[2], PID; 
    if(-1 == pipe(channel)) 
    { 
     perror("Eroare"); 
     return 0; 
    } 
    if(-1 == (inputFile = open("data.txt", O_RDONLY))) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(-1 == (PID = fork())) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(PID != 0) 
    { 
     char buffer; 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     while(1 == read(inputFile, &buffer, 1)) 
      write(channel[1], &buffer, 1); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
    } 
    else 
    { 
     char buffer; 
     if(-1 == close(channel[1])) 
      perror("Error"); 
     while(1 == read(channel[0], &buffer, 1)) 
      printf("%c\n", buffer); 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     printf("Should output this");  
    } 
    return 0; 
} 

또한, 단지 메인 프로세스가 종료 된, 아이가 분리 된 프로세스로에 살고 :

는이 문제를 해결하려면, 당신이 이런 식으로 읽기 시작하기 전에 쓰기 끝을 닫습니다 전화를 이동 읽으려는 그 전화에 갇혔다.

+0

그러나 자식에게 파이프에 무엇인가를 쓰고, 자식에 대해 부모 'wait (NULL)'을 만든 후에, 부모가 파이프에서 자식이 쓴 것을 읽도록하려면 어떻게해야할까요? – Peter

+1

자식이 파이프의 쓰기 측을 열어두기를 원하면 파이프가 닫힐 때까지 단순히 파이프에서 읽을 수 없습니다. 부모가 자녀에게 모든 데이터를 작성했음을 알리는 다른 메커니즘이 필요합니다. –