inetdの動作は興味深い

この記事の引用は全て、inetd の仕組みを見てみる - naoyaのはてなダイアリーより。


サーバを作る際にはinetdなどのマルチサービスなサーバを利用した方が現実的なプログラムになるのでは、と思ってinetdについて検索してみた。しかしどうやらinetdは複数ポートをリスンしてアクセスがあればプログラムを起動する、サービスを提供したらプログラムを終了する、と言う仕組みをしているそうで、アクセスの多いサービスを作るのには向いていない模様。
ところで、inetd対応プログラムの書き方は、

inetd のひとつ面白いところは、inetd でサービス化したいプログラムの標準入力/標準出力がクライアントソケットの入出力に接続されるところです。

だそうで、その作りの哲学には感動する。
そして、その実装は以下のとおり。

* 複数のサービスをまとめて面倒を見るにあたって、それぞれのサービス用のリスニングソケットを select(2) で多重化する
* 接続があると fork して子を作り、その子を exec して本体のプログラム(daytime.pl や echo.pl に相当するもの) を実行する
* exec する前にソケットディスクリプタを 0, 1, 2 に dup2(2) する

これを見てから調べたんだけど、パイプをC言語で実装するにはpipe()でストリームを作ってからdup2()で標準入出力にくっつけ直すってことをするみたい。
でまあそれを知ってからだと、上の動作が実に必要十分な動きだと分かる。
selectで複数ポートのアクセスを待って、アクセスがあったらforkする。子プロセスはexecを用い、起動するべきプログラムになる。それで、標準入出力およびエラー出力にソケットを複製。
あまりのスムーズさに気絶するほど悩ましい。


しかしまあ…、inetdを前提にプログラム組むんじゃあ、サーバプログラム作りの練習にはならないねえ。