2013-01-05 14 views
5

Potrzebuję jakiś sposób, aby proces rodzica komunikował się z każdym dzieckiem osobno.Widelec rodzica dziecka komunikacja

Mam dzieci, które muszą komunikować się z rodzicem oddzielnie od innych dzieci.

Czy istnieje sposób, aby rodzic miał prywatny kanał komunikacji z każdym dzieckiem?

Czy na przykład dziecko może wysłać do rodzica zmienną struct?

Jestem nowy w tego rodzaju sprawach, więc każda pomoc jest doceniana. Dziękuję

+0

rurociągi! http://www.gnu.org/software/libc/manual/html_node/Pipes-and-FIFOs.html (pamiętaj, że musisz utworzyć potok przed rozwidleniem lub nie mogą się komunikować) –

+2

To zależy od platformy. Na jakiej platformie zamierzasz działać? –

Odpowiedz

22

(ja po prostu założyć, że mówimy tu linux)

Jak zapewne dowiedział się, sama fork() po prostu powielać procesu wywołującego, nie obsługiwać IPC.

Z widelcem instrukcji:

fork() tworzy nowy proces przez powielenie procesu wywołującego. Nowy proces, określany jako dziecko, jest dokładnym duplikatem procesu wywołującego, określanego jako rodzic.

Najczęstszym sposobem poradzenia sobie z IPC po rozwidleniu() jest użycie rur, szczególnie jeśli chcesz "prywatny kanał komunikacyjny z każdym dzieckiem". Oto typowy i łatwy przykładem użycia, podobny do tego można znaleźć w instrukcji pipe (zwracane wartości nie są zaznaczone):

#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; 
    } 

Kod jest dość oczywista:

  1. nadrzędna widły()
  2. Dziecko czyta() z rury aż do EOF pisze
  3. parent() do rury zamyka() to
  4. Dane zostały udostępnione, hura!

Stamtąd możesz zrobić wszystko, co chcesz; pamiętaj tylko, aby sprawdzić swoje wartości zwracane i przeczytać: dup, pipe, , wait ... podręczniki, będą przydatne.

Istnieje również kilka innych sposobów, aby przesłać dane teleadresowe pomiędzy procesami, oni migh Cię zainteresują chociaż nie spełniają one swoje „prywatne” wymóg:

lub eve na prosty plik ... (Użyłem nawet SIGUSR1/2 signals do wysyłania binarnych danych między procesami raz ... Ale nie poleciłbym tego haha.) I prawdopodobnie więcej, o czym nie myślę teraz .

Powodzenia.