どのようにイントラネット制御権をサービスに転送します。以下は私が理解したものです。
- inetdは上記のすべてのポートをリッスンします。
/etc/inetd.conf
- クライアントがinetdがリッスンしているポートの1つに要求をすると、inetdは要求を子プロセスに回転させて要求制御をサービスに転送します。
/etc/inetd.conf
- マルチプレクサとして機能します。
私の質問は次のとおりです
- リクエストはどのようにサブプロセス(各サービスデーモン)に切り替えられますか?
- inetdはすでにポートに接続されているため、inetdがポートを解放するまで、子プロセスはそのポートを再利用できません。 inetdがポートを解放すると、既存のクライアント接続が削除されます(誤って理解した場合は訂正してください)。
答え1
inetd
ポートでリッスンし、それを処理するサービスのstdin、stdout、およびstderrに接続します。
どのように行われますか
accept
接続すると、そのうちの1つにソケットがありますfd
。- その後、に
dup
コピーされます。fd
0
1
2
- それではそうでしょう
fork
。すべてのファイル記述子は、ファイルを閉じるアクションを取らない限り、開いたままになります(0、1、2は開いたままです)。 - その後、子プロセスが呼び出され、
exec
sfd
はまだ開いています。 - これでサービスが実行され、リモートクライアントがstdin(0)、stdout(1)、およびstderr(2)に接続します。
- サービスは、クライアントがこれらのファイル記述子にあることに注意する必要があり、
listen
独自の操作を実行する必要はありません。
(いくつかの検索をしましたが、呼び出されたinetd
サービスプログラムを知らせる内容を見ることができませんinetd
。コマンドライン引数があることを願っています。)
答え2
次の措置を検討してください。
[親の]
sfd = socket(), listen(), connect(), fork();
子プロセスから継承してはいけないか、以前にafterclose()
に設定されている他の記述子の場合、親プロセスはこのsfdを閉じることができます。FD_CLOEXEC;
fork
[子供]
execve();
クライアント I/O に使用できる接続ソケット記述子の継承されたコピー
答え3
で明確に説明されています。Que-Linux-ソケットプログラミングセクションの下The Design Parameters of inetd Servers