파이프를 통해 서로 메시지를 보내고 종료하는 두 개의 자식 프로세스를 생성하는 코드를 작성하려고합니다. 그러나 다음 코드를 실행하면 child2 만 인사말을 인쇄하지만 자식 1은 자식 2가 자식 1이 아닌 메시지를 여전히 인쇄합니다.두 자식 프로세스간에 파이프로 통신하기
아무도 내 방법론에 문제가 있음을 알고 있습니까?
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char** argv) {
char chld_1_send[20] = "hello from child 1";
char chld_1_recv[20];
char chld_2_send[20] = "hi from child 2";
char chld_2_recv[20];
int chld_1_outgoing[2];
int chld_2_outgoing[2];
pipe(chld_1_outgoing);
pipe(chld_2_outgoing);
int chld_1_status, chld_2_status;
pid_t chld_1, chld_2;
chld_1 = fork();
if(chld_1 == 0) {
chld_2 = fork();
}
if(chld_1 == 0 && chld_2 == 0) {
printf("parent [pid:%d] waiting on both children to finish\n", getpid());
while(wait(&chld_1_status) != chld_1 && wait(&chld_2_status) != chld_2) {}
printf("done waiting\n");
}
else if(chld_1 != 0 && chld_2 == 0) {
printf("this is child 1 [pid:%d] with parent [pid:%d]\n", getpid(), getppid());
write(chld_1_outgoing[1], chld_1_send, strlen(chld_1_send));
while(read(chld_1_outgoing[0], &chld_1_recv, sizeof(chld_2_recv)) < 0) {}
printf("child 2 said '%s'\n", chld_1_recv);
exit(0);
}
else if(chld_2 != 0 && chld_1 == 0) {
printf("this is child 2 [pid:%d] with parent [pid:%d]\n", getpid(), getppid());
write(chld_2_outgoing[1], chld_2_send, strlen(chld_2_send));
while(read(chld_2_outgoing[0], &chld_2_recv, sizeof(chld_2_recv)) < 0) {}
printf("child 1 said '%s'\n", chld_2_recv);
exit(0);
}
printf("both children have terminated successfully\n");
return 0;
}
그러나 터미널이 밖으로이 명령 인쇄를 실행하면 무한 루프로 전환 :
$ this is child 2 [pid:15713] with parent [pid:1]
child 1 said 'hi from child 2'
parent [pid:15714] waiting on both children to finish
http://developers.sun.com/solaris/articles/named_pipes.html – Anders
어쨌든 명명 된 파이프없이이 작업을 수행 할 수 있습니까? 한 파이프가 다른 아이와 통신 할 수 있다는 것을 의미합니다. – David
waitpid 호출을 대기로 변경했습니다. 그러나 이제 프로그램은 무한 루프로 진행됩니다. – David