2013-01-05 3 views
5

부모 프로세스가 각 자식과 개별적으로 통신 할 수있는 방법이 필요합니다.포크 부모 자식 통신

다른 자녀와 별도로 부모와 의사 소통해야하는 자녀가 있습니다.

부모가 각 자녀에게 개인 통신 채널을 가질 수있는 방법이 있습니까?

또한 예를 들어 자식이 struct 변수를 부모에게 보낼 수 있습니까?

저는 이런 종류의 것들에 익숙합니다. 그래서 어떤 도움을 주시면 감사하겠습니다. 이 IPC을 처리하지 않습니다, 당신은

+0

파이프 라인! http://www.gnu.org/software/libc/manual/html_node/Pipes-and-FIFOs.html (포크하기 전에 파이프를 만들어야한다는 것을 기억해야합니다. 그렇지 않으면 통신 할 수 없습니다) –

+2

이것은 플랫폼에 따라 다릅니다. 어떤 플랫폼을 실행할 생각입니까? –

답변

22

바로 호출 프로세스를 복제합니다

당신은 아마 발견으로 fork() 자체 (난 그냥 우리가 여기에 리눅스를 이야기하고 가정합니다) 감사드립니다. 포크 매뉴얼에서

:

포크() 호출 프로세스를 복제하여 새로운 프로세스를 생성합니다. 새 프로세스 (하위 프로세스라고 함)는 부모 프로세스라고 불리는 호출 프로세스 인 의 정확한 복제본입니다. 당신이 포크 번) (IPC를 처리 할 수 ​​

가장 일반적인 방법은 "각 자녀가있는 전용 COMUNICATION 샤넬"원하는 특히, 파이프를 사용하는 것입니다. 다음은 (반환 값을 확인하지 않습니다)에 pipe 매뉴얼에서 찾을 수있는 것과 유사한 사용의 전형적인 쉬운 예입니다 :

  1. 부모 :

    #include <sys/wait.h> 
        #include <stdio.h> 
        #include <stdlib.h> 
        #include <unistd.h> 
        #include <string.h> 
    
        int 
        main(int argc, char * argv[]) 
        { 
         int pipefd[2]; 
         pid_t cpid; 
         char buf; 
    
         pipe(pipefd); // create the pipe 
         cpid = fork(); // duplicate the current process 
         if (cpid == 0) // if I am the child then 
         { 
          close(pipefd[1]); // close the write-end of the pipe, I'm not going to use it 
          while (read(pipefd[0], &buf, 1) > 0) // read while EOF 
           write(1, &buf, 1); 
          write(1, "\n", 1); 
          close(pipefd[0]); // close the read-end of the pipe 
          exit(EXIT_SUCCESS); 
         } 
         else // if I am the parent then 
         { 
          close(pipefd[0]); // close the read-end of the pipe, I'm not going to use it 
          write(pipefd[1], argv[1], strlen(argv[1])); // send the content of argv[1] to the reader 
          close(pipefd[1]); // close the write-end of the pipe, thus sending EOF to the reader 
          wait(NULL); // wait for the child process to exit before I do the same 
          exit(EXIT_SUCCESS); 
         } 
         return 0; 
        } 
    

    코드 꽤 자기 설명이다 파이프에

  2. 부모가 기록 EOF까지 파이프에서 포크()
  3. 아이가 읽고()() 후 종료()이
  4. Datas 공유되었습니다 만세!

거기에서 원하는 것을 할 수 있습니다. 반환 값을 확인하고 dup, pipe, fork, wait ... 설명서를 읽는 것을 잊지 마십시오.

그들이 당신의 "개인"요구 사항을 충족하지 않지만 그들이 당신을 관심 migh, 또한 프로세스간에 datas를 공유 할 수있는 다른 방법의 무리가 있습니다

또는 전날에 기본적으로 파이프 있습니다

  • FIFO files
  • 를 사용한 경우
  • sockets, 그들은 분명히 좋은 일 na 간단한 파일 ... (나는 심지어 SIGUSR1/2를 사용했습니다. 프로세스간에 바이너리 데이터를 보내려면 signals을 사용했습니다 ... 그러나 나는 그 하하를 추천하지 않습니다.) 아마도 지금 당장 생각하지 않는 것이 더 있습니다. .

    행운을 빈다.