2014-09-16 2 views
0

나는이 기본적인 의사 소통을 할 수 없다. 내가 원하는 것은 아이의 표준 출력을 통해 부모 파일 기술자에게 정보를 보낸다. 나는 seg fault를 얻고있다.양방향 파이프 통신. 자제 할 수 없다.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define READ 0 
#define WRITE 1 
int main(void){ 


int fdRead[2]; 
int pid, i, num; 
FILE* output; 

char mystring [100]; 
char c; 

pid = fork(); 
if(pid){ 
    FILE * read; 
    close(fdRead[WRITE]); 
    read = fdopen(fdRead[READ], "r");  
    fgets(mystring,100, read); 
    printf("parent %d",mystring); 
} else { 
/* child */  
    dup2(fdRead[WRITE], STDOUT_FILENO); 
    close(fdRead[READ]);  
    close(fdRead[WRITE]); 


    printf("child"); 


} 
exit(0); 

}

+1

이 활성화 경고와 함께 컴파일하려고 다음과 같이 파이프를 사용하여 부모와 자식 프로세스 사이의 통신을위한 코드 (* GCC *와 * 그 소리 *에 대한'-Wall -Wextra') 보인다. 먼저 경고를 수정하십시오. 초기화되지 않은 배열을 사용하는 것과 같습니다. – hyde

+0

세그먼트 결함이 발생하는 이유는'read = fdopen (fdRead [READ], "r"); ''read'는'NULL'이고'fgets (mystring, 100, read)'에 cfallump되어'fget' 전에 검사합니다. 코어 덤프가있는 경우 gdb를 사용하여 코어 덤프를 디버깅하십시오. –

+0

그리고'fdRead'를 실행하기 전에 파이프를 생성하지 마십시오. –

답변

0

코드는 파이프에 대해 아무것도하지 않습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define READ 0 
#define WRITE 1 

int main(void){ 
    int pipefd[2]; 
    pid_t pid; 
    int i, num; 

    if (pipe(pipefd)<0) { /* create pipe */ 
     perror("pipe"); 
     exit(-1); 
    } 

    char mystring [100]; 
    char c; 

    pid = fork(); 
    if(pid<0){ 
     perror("fork"); 
     exit(-1); 
    } else if (pid=1) { /* parent */ 
     char *mystring = "message to child"; 
     write(pipefd[WRITE],mystring,strlen(mystring); 
     sleep(1); /* wait for child read message */ 
     char buf[128]; /* buffer to receive data from child */ 
     read(pipefd[READ],buf, sizeof buf); 
     close(pipefd[READ]); 
     close(pipefd[WRITE]); 
     printf("Returned from child %s",buf); 
     return 0; 
    } else { /* child */ 
     char *s="send from child: "; 
     char buf[128]; 
     read(pipefd[READ],buf, sizeof buf); 
     write(pipefd[WRITE],s,strlen(s)); 
     close(pipefd[READ]); 
     close(pipefd[WRITE]); 
     return 0; 
    } 
}