Linuxの備忘録とか・・・(目次へ)Linuxの備忘録とか・・・(目次へ)リダイレクトとパイプ連結リダイレクトリダイレクトは出力をファイルにする機能で、出力先のファイルディスクリプター0を、通常ファイルのファイルディスクリプターに書き換えることで実現できます。testをシュミレートしています。NULL);}まずtestファイルを書き込みモードで作成し、forkでプロセスを作成したのち、このファイルディスクリプターを標準出力であるファイルディスクリプター1に差し替えて、子プロセスをexeclpでpsコマンドに置き換えています。従って、起動されたpsコマンドの標準出力はtestに書き込む形で動作することになります。forkは親のプロセスディスクリプターを複写して子プロセスのディスクリプターを作成します。CopyOnWriteにより、参照においてメモリを共有することになります。execlpは新規の仮想メモリー空間にpsをロードしますが、ファイルディスクリプターを初期化することはありません。従って子プロセスのps関数のfdは、親プロセスのopenのfdであり、そのinodeも同じものとなります。リダイレクトとは子プロセスの標準出力ディスクリプター1に、リダイレクト先ファイルのファイルディスクリプターを差し替えることで実現できます。p/sdupは0から空いているディスクリプターを取得します。close(1)で1をクローズすることで、dup(fd)はディスクリプター1に差し替えられます。シュミレートするサンプルです。考え方はリダイレクトと同じです。リダイレクトでは実ファイルのファイルディスクリプターを取得していましたが、パイプではパイプのファイルディスクリプター読み込み用と書き込み用2つを取得します。ここで2つディスクリプター取得していますが、パイプそのものは1つだけで、読み込み用と書き込み用別々にファイルディスクリプターを取得しているだけです。psコマンドの子プロセスと、catコマンドの子プロセスを作成し、psコマンドには書き込み用のファイルディスクリプターを標準出力に差し替えて、catコマンドには読み込み用のファイルディスクリプターを標準入力に差し替えることで実現できます。NULL);}リダイレクトとパイプに連結は、シェルによるもので、カーネルそのもの機能ではありません。パイプも実ファイルもinodeとして管理されていることを考えれば、パイプもリダイレクトも、ファイルディスクリプター差し替えることで実現できるわけで、カーネルから見れば両者は同じような物と言えそうです。ノースAdsense広告情報が設定されていません。