私のパイプラインには一連のプロセスがあります。
cat haystack | grep needle | my_process | less
私の理解は、シェルが各コマンドに対して同時にフォークしてexecveを実行することです。
my_processがPIDを決定したと仮定すると、grepとlessが完全に開始されたことを確認します(execve'd)。
答え1
さて、Linuxでは以下を確認できます。/proc/PID/exe
(p=$BASHPID; /bin/ls -l /proc/$p/exe; exec /bin/ls -l /proc/$p/exe)
... 0 Jan 17 10:34 /proc/17816/exe -> /bin/bash
... 0 Jan 17 10:34 /proc/17816/exe -> /bin/ls
しかし、私はこれの利点を実際に見ていません。シェルはbeforeパイプを読み書きできないため、exec
パイプはbefore時間が少しでもスムーズに動作しますexec
。実際、これは小さいexec
しばらくして実行しているプログラムを調べるためにそこに行くことができても、これが起こっても驚かないでしょう。
答え2
これが開かれたファイル記述子を継承する目的です。
FIFOを生成します。親シェルでclose-on-exec書き込み専用ファイル記述子を開きます。すべてのfork()
edサブエントリはそれを継承しますexecve()
。取得する必要があるプロセスの読み取り専用ファイル記述子を開くexecve()
か、プロセスがすでに開いている読み取り専用ファイル記述子を継承してください。書き込み専用の終了が閉じられると、execve()
読み取り専用の終了はEOFを返します。
個人を検出するためにexecve()
複数のFIFOに一般化できます。実際、FIFOに気をつける必要はありません。2番目のパイプセットを使用してください。, 書き込みファイル記述子は close-on-exec に設定されます。
これが実際に何かを説明していないので~のため実際にやりたいことにこれを構築する方法を見つけることはあなたの使命です。
答え3
Linuxのみで、次のものが付属していますzsh
。
$ autoload zsh/stat
$ (zstat +link /proc/*/fd/0(e'{[[ $REPLY -ef /proc/self/fd/1 ]] &&
reply=$REPLY:h:h/exe}')) | cat
/bin/cat
これは、標準入力で開くサブシェルの標準出力と同じパイプを持つプロセスの実行可能ファイルへのパスを提供します。したがって、上記の時間はcat
すでに実行されています。