2011-03-28 6 views
1

다음 코드는 소켓 쌍을 사용하여 자식 프로세스에서 부모 노드로 메시지를 보냅니다.socketpair 함수의 파일 설명자를 두 번 이상 사용할 때 "잘못된 파일 설명자"오류가 발생했습니다.

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MESSAGE "Hello" 

int main() 
{ 
    char message[100]; 
    int i, pidFork, sockets[2]; 

    /* 
    *Trying to use a single socketpair function call 
    * 
    *if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) { 
    * perror("Creating socketpair"); 
    * exit(-1); 
    *} 
    */ 

    for(i=0; i<2; i++) { 

     if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) { 
      perror("Creating socketpair"); 
      exit(-1); 
     } 

     printf("i: %d\n", i); 
     pidFork = fork(); 
     if (pidFork == -1) { 
      perror("Creating child process"); 
      exit(-1); 
     } 

     else if (pidFork != 0) { //Parent 
      close(sockets[0]); 
      if(read(sockets[1], message, strlen(MESSAGE)) == -1) { 
       perror("Reading data"); 
       exit(-1); 
      } 
      printf("Data: %s\n\n", message); 
      close(sockets[1]); 
     } 

     else { //Child 
      close(sockets[1]); 
      if(write(sockets[0], MESSAGE, strlen(MESSAGE)) == -1) { 
       perror("Writing data"); 
       exit(-1); 
      } 
      close(sockets[0]); 
      exit(0); 
     } 
    } 
    return 0; 
} 

먼저 나는 그런 주석 라인에서 볼 수 있듯이, for 루프를 입력하기 전에 socketpair의 기능을 하나의 호출로 소켓 쌍에 대한 파일 디스크립터를 얻기 위해 시도했지만 첫 번째 반복이 유일한 작품에서 반복에서 두 번째로 "잘못된 파일 기술자 오류"를 얻었습니다. 내가 만든 방법은 for 루프 내부에서 socketpair 함수 호출을 이동하는 것이 었습니다. 그러나 파이프를 사용할 때 첫 번째 방법이 효과적이었습니다.

왜 이런 일이 발생하는지 알고 싶습니다. 실수를 저지르고 있습니까? 또는이 두 IPC 메커니즘의 차이점이 있습니까?

감사

업데이트 : 파이프와 socketpair의의 파일 기술자 사이에는 차이가 없습니다. 전체 프로그램의 다른 부분에서 오류가 발생했기 때문에 파이프로 작업하고 있다고 생각했습니다. 대답이 내 문제를 해결했습니다.

답변

1

부모와 자녀 모두 socketpair의 양쪽 끝을 닫습니다.

일반적으로 자식 프로세스 당 하나의 소켓 쌍 또는 파이프를 사용하십시오.

+0

답변과 제안에 감사드립니다. Close 함수에 대한 모든 호출을 제거하면 작동합니다. 그 접근법은 대부분의 예제에서 발견 되었기 때문에 사용되었습니다. 자식 및 부모 프로세스의 두 파일 설명자 모두를 가까이서 호출합니다. 또한 파이프를 사용할 때 호기심을 위해 닫기 함수를 호출 할 때조차도 작동합니다. 왜 그런지 알고 있습니까? –

+0

@Mkfnx : 아니요. 파이프와 함께 작동한다는 것은 매우 놀랍습니다. –

+0

@Mkfnx : "socketpair()"시스템 호출을 "pipe()"로 대체 할 때 작동하는지 확인합니까? 나는 Larsmans에 동의한다. 그것은 매우 이상하다. "dup()"또는 "dup2()"에 대한 호출이 없습니까? 안녕! –

관련 문제