2017-05-20 9 views
0

파이프를 통해 통신하기 위해 2 개의 프로세스를 만들려고합니다. 아이가 파이프에 글자를 쓸 때까지 기다렸다가 부모는 파이프에서 글자를 읽고 화면에 표시합니다. 문제는 필자가 파이프에 문자를 성공적으로 쓰는 것입니다. (필자는 즉시 테스트를 수행하여 파이프에 있음을 확인했습니다.)하지만 파이프에서 부모가 읽을 때 아무 것도 없습니다. 나는 이유를 정말로 이해하지 못한다. 모든 것이 잘 보입니다.예기치 않은 pipe() 동작

int PID, canal[2]; 
if(-1 == (PID = fork())) 
{ 
    perror("Error"); 
    return 0; 
} 
if(-1 == pipe(canal)) 
{ 
    perror("Error"); 
    return 0; 
} 
if(PID == 0) 
{ 
    close(canal[0]); 
    printf("Child\n"); 
    char buffer = 'C'; 
    if(0 == write(canal[1], &buffer, sizeof(char))) 
     printf("Didn't write anything\n"); 
    close(canal[1]); 
} 
else 
{ 
    char readBuffer; 
    wait(NULL); 
    printf("Parent\n"); 
    close(canal[1]); 
    if(read(canal[0], &readBuffer, sizeof(char))) 
    { 
     printf("I read: "); 
     printf("%c\n", readBuffer); 
    } 
    close(canal[0]); 
} 
+0

제발, (이 코드는 실행 프로그램에 대한 질문을 할 때) 실제 입력을 게시하고, 게시 된 코드가 전체 프로그램이 아니며 확실히 컴파일되지 않는 게시물 코드를 게시하십시오. 예상 출력, 실제 출력 게시. – user3629249

+0

'write()'함수는 -1을 반환 할 수 있습니다. 이 경우 오류가 발생했습니다. -1을 체크하고'perror()'를 호출해야한다. 반환 값이 0 일 때 나머지 데이터를 시도하고 출력하기 위해 반복해야한다. 성공한 경우, 쓰여진 바이트 수가 반환됩니다 (0은 이 쓰이지 않음을 나타냄). *이 숫자가 숫자보다 작 으면 * 오류가 아닙니다. 요청 된 바이트 수 (예 : 디스크 장치가 채워 졌기 때문에 발생할 수 있습니다.) NOTES도 참조하십시오. " – user3629249

+0

자식 프로세스는 'if'코드 블록의 끝에서 실행되지 않고'exit()'를 호출해야합니다 (즉, 자식이'else'코드 블록의 끝에서 아무것도 실행하지 않는다는 것을 의미합니다. – user3629249

답변

5

포크를 호출 한 후 파이프를 호출하는 것이 문제입니다. 따라서 부모와 자식은 서로 다른 사본을 얻습니다. 포크를 호출하기 전에 통화를 파이프로 이동하십시오.

+0

아, 나는이 일에 대해 알고 있었지만 실수를 눈치 채지 못했습니다. 나는 항상 그것에 유의해야합니다. – Peter