GNU/Linux >> Linux の 問題 >  >> Linux

CHILD PROCESSから戻り値を取得するには?

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 に渡すことができます。


Linux
  1. PythonGDB (GDB 7.1) で gdb.execute から出力を取得するには?

  2. 親プロセスから子プロセスを取得する方法

  3. IP (Linux) からホスト名を取得するには?

  1. grep から cp に出力をパイプする方法は?

  2. コマンドラインからGNU/Linuxで特定のプロセスの親PIDを取得するには?

  3. uidからユーザー名を取得する方法

  1. すべての子プロセスを見つける方法は?

  2. バックグラウンドプロセスのプロセスIDを取得するには?

  3. 開始したばかりのプロセスのpidを取得する方法