リダイレクトは、オペレーティングシステムのカーネルではなく、シェルの概念ですか?
システムコールリダイレクトはどのように実装されますか?
リダイレクトの実装はパイプに似ていますか?
答え1
リダイレクトの場合、stdin(<入力を介した入力)とstdout(>出力を介した出力)を置き換えるためにdup2()を使用するシェルでこれ(リダイレクト)が達成されるとします。
- 入出力用にファイルを開く in = open() out = open()
- dup2(in, 0) // 入力ファイルを標準入力に置き換える
- dup2(out, 1) // 出力ファイルを stdout に置き換えます。
- 近似)
- 閉じる(アウト)
- 実装する()
パイプの場合、 Pipe(2) システムコールは同様の方法で使用されます。つまり、読み出し終了と書き込み終了があります。パイプを介して接続された各コマンドは、パイプの一方の端から読み取られ、もう一方の端に書き込まれます。 stdin, stdout は、コマンドの対応するパイプの終わりを置き換えます。
答え2
「リダイレクト」はシェルの概念で、詳細は話すシェルによって異なります。
ただし、リダイレクトの基本は、起動時に事前に開く入力および出力ファイル記述子の概念にあり、これは関数の動作に戻りますexecve
。つまり、子プロセスは開かれたファイル記述子を継承します。
したがって、子プロセス(コマンド)を開始するには、親プロセス(つまりシェル)は最初に子プロセスの子プロセスを作成し、次に子の適切なパイプエンド(ファイル記述子0、1、2)を設定します。 「プロセス」入力と出力を選択し、子プロセスが実行に合格したときにそれを継承しますexecve
。
はい、パイプラインです。