GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendapatkan nilai pengembalian dari PROSES ANAK?

TLDR

int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus

Referensi

Halaman manual untuk waitpid menunjukkan tanda tangan tipenya adalah:

pid_t waitpid(pid_t pid, int *stat_loc, int options);

Ini juga menyatakan bahwa kita dapat menyimpan informasi proses dengan stat_loc argumen:

jika nilai argumen stat_loc bukan penunjuk nol, informasi harus disimpan di lokasi yang ditunjuk oleh stat_loc

stat_val argumen adalah nilai integer yang ditunjuk oleh stat_loc .

Kami kemudian menggunakan WEXITSTATUS(wstatus) untuk mengekstrak nilai kembalian kami dari proses.

WEXITSTATUS(stat_val ):Jika nilai WIFEXITED(stat_val) bukan nol, makro ini mengevaluasi ke 8 bit orde rendah dari argumen status yang diteruskan proses anak ke _exit() atau exit(), atau nilai proses anak dikembalikan dari main().


Ups! Ini bukan bash! Pokoknya...

Alasan pemijahan suatu proses adalah untuk melanjutkan aliran utama, sementara melakukan sesuatu yang tidak mempengaruhi itu. Saya menjalankan direktori 10k gambar, &memindahkan duplikat. Saya meletakkan kode pembanding dalam fungsi &subproses itu. Ini sangat cepat.

Cara untuk mendapatkan nilai kembali adalah dengan membuat sebuah pipa, menggemakan sebuah nilai ke dalamnya kemudian membaca pipa tersebut:(Peringatan! kode berikut mungkin tidak berfungsi, ini hanya menunjukkan pipa yang berfungsi)

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"

Satu-satunya masalah sejauh ini adalah saya sedang mengerjakan drive usb, &izin menghentikan saya membuat pipa. Selain itu ...


Yang Anda cari adalah wait() atau waitpid().


Seperti kata dtmilano, Anda harus menggunakan wait atau waitpid, tergantung atau dibutuhkan.

Tapi mungkin Anda harus membagi program Anda menjadi dua bagian dan menjalankan putranya dengan exec. Saat Anda membuat fork, proses anak Anda menerima pid sama dengan 0 dan saya tidak tahu apakah Anda mencoba menunggu sinyal proses dengan pid 0 akan berfungsi dengan baik.

Bagaimanapun Anda dapat lulus, meskipun itu bukan cara terbaik, nilai dihitung oleh proses anak Anda melalui keluar.


Linux
  1. Bagaimana menemukan semua proses anak?

  2. Bagaimana cara mendapatkan output dari gdb.execute di PythonGDB (GDB 7.1)?

  3. Bagaimana saya mendapatkan sed untuk membaca dari input standar?

  1. Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

  2. Cara mendapatkan PID dari proses anak bercabang di skrip Shell

  3. Bagaimana cara mendapatkan nama host dari IP (Linux)?

  1. Bagaimana cara mendapatkan PID dengan nama proses?

  2. Bagaimana cara menyalurkan output dari grep ke cp?

  3. Bagaimana cara mendapatkan PID induk dari proses yang diberikan di GNU/Linux dari baris perintah?