2017-10-15 24 views
0

두 개의 형제 프로세스 인 Child1에서 Child3으로 문자열 "Hi"를 보내려고합니다. 코드는 실행되지만 Child3의 Child1에서 입력을받지 못합니다.명명 된 파이프를 사용하여 두 프로세스간에 문자열 보내기

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <fcntl.h> 
#include <sys/stat.h> 

#define MSGSIZE 1024 

int main (int argc, char *argv[]){ 

    int fd; 
    char * myfifo = "/desktop/myfifo"; 
    char l[MSGSIZE]; 
    pid_t child1, child3; 
    mkfifo(myfifo, 0666); 
    child1 = fork(); 

if (child1 == 0) { 

    printf("I am Child 1: %d \n", (int)getpid()); 
      fd = open(myfifo, O_WRONLY); 
      write(fd, "Hi", MSGSIZE); 
      close(fd); 
    } 

else { 

    if (child1 > 0) { 
     printf("I am parent: %d \n", (int)getpid()); 

     wait(0); 
    } 

    child3 = fork(); 

    if (child3 == 0) { 
     printf("I am Child 3: %d \n", (int)getpid()); 

     fd = open(myfifo, O_RDONLY); 
     read(fd, l, MSGSIZE); 
     printf("Received: %s \n", l); 

     close(fd); 
    } 
} 
    wait(0); 
    unlink(myfifo); 
    return 0; 
} 

누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

+0

당신의 파이프가 제대로 만들어 졌는지 확인하지 않았다고 생각하십니까? 항상 시스템 콜을 확인하십시오! 오류는 무시할 수 없습니다. – Stargateur

답변

0

비 차단 IO를 수행하지 않는 한 FIFO의 한쪽 끝을 열면 다른 쪽도 열 때까지 차단됩니다. 따라서 child1 블록은 open(2) 호가 child3까지 파이프 끝을 열 때까지 호출됩니다. 그러나 부모 프로세스 wait(2)이라고 전화를 걸어 앞에 child3을 포크하십시오. 부모가 child3을 포크로 child1 기다리고 있지만, child3 파이프의 다른 쪽 끝을 열기를위한 child1 기다리고 있습니다 :

그래서 당신은 교착 상태가 있습니다.

적어도 두 가지 방법으로 해결할 수 있습니다. 먼저, 두 번째 하위 프로세스를 포크 한 후에 wait(2) 호출을 넣기 만하면됩니다. 다른 방법은 부모 프로세스에 pipe(2)을 생성하고 자식이이 설명자를 상속하고 다른 방식으로 데이터를 전달하도록합니다.