ファイル記述子が各プロセスに固有の場合(つまり、2つのプロセスが同じファイル記述子IDを使用して異なるオープンファイルを参照できる場合)、ソケット(共有mmapなど)などの共有を介してファイル記述子を転送する方法ありますか?
同じ数値アドレス範囲にマップされる各プロセスの下のカーネルに依存していますか?
答え1
ソケットを介してファイル記述子を共有すると、カーネルはそれを仲介します。以下を使用してデータを準備する必要があります。cmsg(3)
これ、以下を使用して送信sendmsg(2)
以下を使用して受信します。recvmsg(2)
カーネルは、ファイルディスクリプタを転送するのに必要なデータとしてファイルディスクリプタで変換を処理し、ファイルディスクリプタを受信プロセスで使用できるようにする後者の2つのタスクに関与します。
異なるプロセスの同じfdがどのように同じファイルを指すことができますか?便利な背景を提供してください。送信プロセスは、自身の(個人)ファイル記述子テーブルに関連する内容を意味するファイル記述子を送信する。カーネルはシステム全体のオープンファイルテーブルにマップされている内容を知り、必要に応じて受信プロセスのファイル記述子でそれを更新します。シンボルテーブルの新しいエントリです。