ソケット接続を受け入れるときに fork() が子プロセスからオフになるサーバーを作成しています。
子がクライアントと通信するとき、その情報の一部を親に送り返す必要があります。これを実現するためにパイプを使用しています。
問題は、親子 IPC を実行しようとすると、子からの入力を読み取るときに親がブロックすることです。つまり、子が同時に実行されていても、それらはすべて親を待っているため、一度に 1 つずつしか処理できません。
私のコードは次のようになります(簡潔にするためにエラーチェックは削除されています):
/* loop: wait for clients to connect */
for(;;) {
pipe(write_to_parent); /* create pipe between parent and child */
pipe(write_to_child); /* create pipe between parent and child */
newsockfd = accept(...);
pid = fork();
if (pid == 0) { /* child process */
close(write_to_parent[0]);
close(write_to_child[1]);
printf("Connected!\n");
while ((rc = recv(newsockfd, ...)) > 0) {
/* process socket request */
/* write stuff to parent that is related to what we recv'd from client */
rc = write(write_to_parent[1], &buf, 1024);
}
printf("Disconnected!\n");
exit(0);
} else { /* parent */
close(write_to_parent[1]);
close(write_to_child[0]);
while (read(write_to_parent[0], &buf, 1024) > 0) {
/* accept data from child process, and do some processing */
}
}
}
だから私の質問は、どうすればこれを解決できますか? ブロックされないように、親がパイプを使用して子と通信するにはどうすればよいですか?
これはパイプでも可能ですか、それとも代わりに共有メモリ(セマフォを使用すると思います)またはメッセージキューを使用する必要がありますか? (この投稿を読みました: Unix/Linux IPC の比較ですが、これらのタスクが実際にどのように達成されるかの例を見つけるのは非常に困難です。)
詳細:
次のことを行うテスト プログラムがあります。 1. サーバーに接続する 2. スリープ(5) 3. サーバーから切断する
このプログラムの 2 つのインスタンスを実行すると、サーバーは次のように出力します。
connected!
// pause for 5 seconds
disconnected!
connected!
// pause for 5 seconds
disconnected!
明らかに、各クライアントを一度に 1 つずつ処理します。
IPC を削除すると、親と子の両方からパイプ read() と write() を削除すると、次のようになります。
connected!
connected!
// pause for 5ish seconds
disconnected!
disconnected!
これは私が欲しいものです!
これを達成する方法について何か考えはありますか?(または、この問題を解決しようとしている方法を変更する必要がありますか?)
(編集: これはネットワーク クラスの課題の一部です。集中型サーバーを使用してピアを管理する P2P プロトコルを実装しています。任意の言語を使用できますが、C で試してみようと思いました。)