bash / zshがfd0 / 1/2を読み書きモードで開くのはなぜですか?

bash / zshがfd0 / 1/2を読み書きモードで開くのはなぜですか?

私が理解したところ、fd0は標準入力用なので、プロセスは標準入力から読み取るだけではありません。同様に、fd1とfd2はstdout / stderr用なので、プロセスはここに書くだけです。ただし、bash / zshは読み取り/書き込みモードでttyデバイスファイルを一度だけ開き、3つの記述子間でコピーするようです。これに関連する質問:

  1. 正しく理解しましたか?
  2. システムファイルテーブルに複数のエントリを保存するためにコピーしますか(各エントリは異なるモード:r / w)?行動に違いがありますか?
  3. bash / zshがOSに依存しない読み書きモード(u)モードでfd0 / 1/2を開くと仮定するのは安全ですか?

答え1

はい、これはdup2()

主な効果は、実際にはすべて同じ「オープンファイル」構造を参照しているため、シリアルコンソールの転送速度設定やファイルの読み取り/書き込み位置などの状態を共有することです。

あなたのプログラムはstdin/stdout/stderrについて「おそらく存在する可能性が高い」以外は何も仮定できません。 stdoutがファイルまたはパイプにリダイレクトされると、書き込み専用である可能性が高く、他のファイルとは異なるファイルを参照します。プログラムは通常、これらのファイル記述子が開いていると仮定することができ、ユーザーは強制的に閉じると奇妙なことが起こることを知っています。

ユーザーと会話するために端末ハンドルが本当に必要な場合は、/dev/ttyプログラムでそれを開くとハンドルが提供されます。制御端子、存在する場合。プログラムがバックグラウンドサービスとして実行されている場合は失敗する可能性があります。

関連情報