16

親プロセスが各子と個別に通信する方法が必要です。

私には、他の子供たちとは別に親とコミュニケーションをとる必要がある子供たちがいます。

親が各子供とプライベートな通信チャネルを持つ方法はありますか?

また、たとえば、子は親に構造体変数を送信できますか?

私はこの種のことに慣れていないので、どんな助けでも大歓迎です。ありがとうございました

4

1 に答える 1

40

(ここではLinuxについて話していると仮定します)

お気づきかもしれませんが、fork()それ自体は呼び出しプロセスを複製するだけで、IPCを処理しません。

フォークマニュアルから:

fork() は、呼び出しプロセスを複製して新しいプロセスを作成します。子と呼ばれる新しいプロセスは、親と呼ばれる呼び出しプロセスの正確な複製です。

forked() 後に IPC を処理する最も一般的な方法は、パイプを使用することです。特に、「各子とのプライベート通信チャネル」が必要な場合はそうです。マニュアルにあるものと同様の典型的で簡単な使用例を次に示しpipeます (戻り値はチェックされません)。

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

コードは一目瞭然です。

  1. 親フォーク()
  2. 子はEOFまでパイプからreads()
  3. 親がパイプに write() してから close()
  4. データが共有されました、万歳!

そこから、やりたいことは何でもできます。dup戻り値を確認し、マニュアルを読むことpipeを忘れないでくださいforkwait役立つでしょう。

プロセス間でデータを共有する方法は他にもたくさんあります。「プライベート」要件を満たしていませんが、興味があるかもしれません。

  • 共有メモリ「SHM」、その名前がす​​べてを物語っています...
  • sockets、ローカルで使用されている場合、それらは明らかにうまく機能します
  • 基本的に名前付きのパイプであるFIFO ファイル

または単純なファイルでさえ...(SIGUSR1 / 2シグナルを使用してプロセス間でバイナリデータを送信したことさえあります...しかし、それはお勧めしません(笑)そして、おそらく私が正しく考えていないものもいくつかあります今。

幸運を。

于 2013-01-05T11:05:16.273 に答える