2014-11-08 6 views
1

계속 C.포크 아이들이

아래의 코드에 대한 fork()pipe()을 학습하기 전에 파이프에 쓰기를 기다리는 것은 파이프와 자식 프로세스를 생성한다. 자식이 메시지를 보내고 부모가 메시지를 읽습니다.

int main() { 
    int  fd[2]; 
    pid_t pid; 
    pipe(fd); 
    pid = fork(); 
    if (pid == 0) { 
     // Child 
     close(fd[0]); 
     write(fd[1], "HELLO", (strlen("HELLO")+1)); 
     exit(0); 
    }else{ 
     // Parent 
     close(fd[1]); 
     char buffer[80]; 
     read(fd[0], buffer, sizeof(buffer)); 
     printf("Received string: %s", buffer); 
    } 
    return 0; 
} 

괜찮습니다. write 행에 댓글을 달면 부모는 이상한 문자가있는 문자열을 받았음을보고합니다. 이는 내 프로그램과 관련이없는 메모리를 읽고 있기 때문에 정상적인 것 같습니다.

하지만,이 질문에 제공합니다 :되어 있지 그것은 가능한 부모가 데이터를 기록 할 수 아이 전에 파이프 을 읽을? 그것이 일어난다면 이상한 인물을 읽는 것입니다.

부모가 자식으로부터 데이터를 쓰려면 "대기"할 수 있습니까?

미래에는 여러 가지 하위 프로세스가있을 수 있으며 계속 진행하기 전에 부모가 모든 어린이가 작업을 마치면 "대기"할 수 있기를 바랍니다. 당신이 기록 라인을 코멘트 경우

+1

에 의해 반환 된 값을 확인을 * * 모든 ** 해당 시스템 호출. 맹목적으로 읽지 않은 물건을 읽었으므로 쓰레기가 보입니다. – Mat

+0

@Mat : 시스템 호출은 무엇입니까? 'fork()'와'pipe()'를 의미합니까? – Voldemort

+0

... 그리고'read'와'write'.모든 것들은 실패 할 수 있고, 심지어 그들이하지 않을 때에도 반환 된 정보는 일반적으로 올바른 프로그램을 만들기 위해 필요합니다. (일반적으로 실패한 '닫기'에 대해 할 수있는 일은 많지 않지만 실패 할 수도 있습니다.) – Mat

답변

1

는, 부모가 write에 대한 호출이 아이에 생략하는 경우가 이상한 문자

로 문자열을받은 것으로보고, 자식 프로세스는, 아이의 작성을 종료 파이프 끝단이 닫힙니다.

부모가 파이프의 자식 끝이 닫혀있는 것을 감지하면 read()이 호출됩니다. 부모는 실제로 아무것도 읽지 않았기 때문에 버퍼는 초기화되지 않은 상태로 유지되고 "쓰레기"가 출력됩니다.

아래 read's POSIX specification에서 relvant 절 찾아주세요 :) 어떤 프로세스가 쓰기 위해 열려 파이프가 없습니다

  • 경우, 읽기 (한다

    빈 파이프 나 FIFO에서 읽는 파일 끝을 표시하려면 0을 리턴하십시오.

[...]

  • 일부 과정은 쓰기 개방 파이프가 있고 O_NONBLOCK가 지워지면, 판독() 어떤 데이터가 기록 또는 파이프에 의해 폐쇄되기 전까지 호출 스레드가 차단하여야 쓰기 위해 열어 둔 모든 프로세스.

이 시험을 아무것도를 작성하지 않는 아이의 경우를 처리하는 코드를 사용할지 여부 '에 대한 부모의 전화 읽기()`정말 뭔가 읽어

  ssize_t result = read(fd[0], buffer, sizeof(buffer)); 
      if (-1 == result) /* Also ALWAYS test for error. */ 
      { 
       perror("read() failed"); 
      } 
      else if (0 == result) 
      { 
       fprintf(stderr, "read() returned without having read anything.\n") 
      } 
      else 
      { 
       printf("Received string: '%s'", buffer); 
      }