ITインフラ技術の実験室ITインフラ技術の実験室Linuxを中心に、仮想化やネットワーク、Windowsまで、ITインフラ技術に関するノウハウを幅広く紹介します。Flash)マルチプロセスによる多重化の特徴シングルプロセス・シングルスレッド方式は、select()を使用して複数のディスクリプタを同時に見張り、クライアントからの新規接続や接続中クライアントからの受信など、記述子の変化があった場合に処理を進めることで、多重化を実現していました。今回紹介するマルチプロセス方式では、accept()にてクライアントからの接続を待ち、接続が来るたびに子プロセスを生成して送受信処理を子プロセスに任せ、自身(親プロセス)は再度accept()を実行して接続処理に専念するという方式になります。マルチプロセスというと、シングルプロセスの応用に聞こえるため難しそうですが、fork()とシグナルハンドラを理解していれば、シングルプロセスのように込み入ったテクニックが不要な分シンプルで分かりやすいコードになります。その一方で、プロセス立ち上げにはそれなりの負荷がかかるというデメリットもあります。※あらかじめいくつかの子プロセスを立ち上げておくプリフォークという方法もありますが、本ページではクライアントからの接続が来るたびに子プロセスを生成する基本的な方法についてのみ説明します。前回取り上げた各方式のメリットとデメリットのうち、マルチプロセスについて再度以下に掲載します。以下の例では、accept()で接続受付を行った後、fork()で子プロセスを生成します。子プロセスは外部クライアントの接続処理を行わないので、ソケット(soc)をクローズして送受信処理(send_recv)のみに専念します(fork()==0)。平行して親プロセス(pid>0)はアクセプトソケット(acc)を閉じ、ループの先頭に戻って再度acceptで接続を待ちます。その間、子プロセスが送受信処理を行っていたとしても接続が終了していたとしても、親プロセスの処理にはなんら影響を与えません。子プロセスは送受信処理を終えると_exit()で終了します。その際に親プロセスにSIGCHLDが通知されるので、シグナルハンドラにてwait()で終了状態を得ます。(子プロセスはwait()しないで放置するとゾンビプロセスになってしまいます。実際はwaitpid()も実施すべきですがここでは割愛しています。)それではコード例を載せます。実際はincludeも必要ですが割愛しています。socket→bind→listenを実行する関数。送受信処理を実施する関数。サーバソケット準備(socket→bind→listenを実行する関数)。コメントをキャンセルメールアドレスが公開されることはありません。