私が理解したところ、fd0は標準入力用なので、プロセスは標準入力から読み取るだけではありません。同様に、fd1とfd2はstdout / stderr用なので、プロセスはここに書くだけです。ただし、bash / zshは読み取り/書き込みモードでttyデバイスファイルを一度だけ開き、3つの記述子間でコピーするようです。これに関連する質問:
- 正しく理解しましたか?
- システムファイルテーブルに複数のエントリを保存するためにコピーしますか(各エントリは異なるモード:r / w)?行動に違いがありますか?
- bash / zshがOSに依存しない読み書きモード(u)モードでfd0 / 1/2を開くと仮定するのは安全ですか?
答え1
はい、これはdup2()
。
主な効果は、実際にはすべて同じ「オープンファイル」構造を参照しているため、シリアルコンソールの転送速度設定やファイルの読み取り/書き込み位置などの状態を共有することです。
あなたのプログラムはstdin/stdout/stderrについて「おそらく存在する可能性が高い」以外は何も仮定できません。 stdoutがファイルまたはパイプにリダイレクトされると、書き込み専用である可能性が高く、他のファイルとは異なるファイルを参照します。プログラムは通常、これらのファイル記述子が開いていると仮定することができ、ユーザーは強制的に閉じると奇妙なことが起こることを知っています。
ユーザーと会話するために端末ハンドルが本当に必要な場合は、/dev/tty
プログラムでそれを開くとハンドルが提供されます。制御端子、存在する場合。プログラムがバックグラウンドサービスとして実行されている場合は失敗する可能性があります。