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 olehstat_loc
stat_val
argumen adalah nilai integer yang ditunjuk olehstat_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.