TLDR
int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus
参照
waitpid
のマンページ 型シグネチャが次のとおりであることを示します:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
また、stat_loc
でプロセス情報を保存できるとも述べています。 引数:
引数 stat_loc
の値の場合 NULL ポインターではない場合、情報は stat_loc
が指す場所に格納されます。
stat_val
引数は stat_loc
が指す整数値です .
次に WEXITSTATUS(wstatus)
を使用します プロセスから戻り値を抽出します。
WEXITSTATUS(stat_val
):WIFEXITED(stat_val) の値がゼロ以外の場合、このマクロは、子プロセスが _exit() または exit() に渡した status 引数の下位 8 ビット、または の値に評価されます。 main() から返された子プロセス。
おっとっと!これは bash ではありません。とにかく...
プロセスを生成する理由は、メイン フローを継続し、その間、メイン フローに影響を与えない何かを実行するためです。 10,000 個の画像のディレクトリを調べて、重複を移動しています。比較コードを関数とサブプロセスに入れました。とても速いです。
値を取得する方法は、パイプを作成し、それに値をエコーしてから、パイプを読み取ることです:(警告:次のコードはおそらく機能しません。機能しているパイプが表示されるだけです)
mkfifo pipe
moved=0
# Use imageMagick 'compare' to find files with zero difference:
comPare () {
if [[ ! $(compare -metric AE $1 $2) ]]; then
mv $2 moved;
echo 1 > pipe;
else echo 0 > pipe
fi
}
# For every file in the dir, compare it to every other one:
for file1 in $( ls *.bmp | head -n $(( $( ls *.bmp | wc -l) - 1)); do
for file2 in $( ls *.bmp | tail -n $(( $( ls *.bmp | wc -l) - 1)); do
comPare file1 file2 &
moved=$(( $(cat pipe) + 1 ))
done
done
rm pipe
echo "Moved $moved files"
これまでのところ唯一の問題は、私が USB ドライブで作業していて、パーミッションによってパイプの作成が妨げられていることです。それとは別に...
探しているのは、wait() または waitpid() です。
dtmilano が言ったように、必要に応じて、wait または waitpid を使用する必要があります。
しかし、プログラムを 2 つの部分に分割し、息子を exec で実行する必要があるかもしれません。 fork を作成すると、子プロセスは 0 に等しい pid を受け取ります。pid 0 のプロセスのシグナルを待機しようとしても、正常に動作するかどうかはわかりません。
いずれにせよ、最善の方法ではありませんが、子プロセスによって計算された値を exit に渡すことができます。