Trạng thái thoát của lệnh bị giết phải là số tín hiệu cộng với 128. Vì vậy, bạn có thể sử dụng trạng thái thoát để tìm ra tín hiệu nào đã giết bạn xử lý.
Tôi đã thử nghiệm nó như thế này trên Linux trong shell:
print_exit_status_for_signal () {
(
sleep 1000
echo Exit staus $? = signal $(( $? - 128 ))
) &
sleep 1
killall "${1:+-$1}" sleep
}
print_exit_status_for_signal
print_exit_status_for_signal 15
print_exit_status_for_signal 9
print_exit_status_for_signal KILL
print_exit_status_for_signal TERM
EDIT: Lưu ý rằng một chương trình có thể quyết định thoát với bất kỳ giá trị nào (vì vậy bạn phải quyết định mức độ tin cậy của trạng thái thoát là ảnh hưởng của tín hiệu):
for i in $(seq 256); do
sh -c "exit $i"
echo Program exited with $?
done
Chú thích 1: Trên các hệ thống của tôi, các mã thoát được biểu diễn dưới dạng các số 8 bit không dấu để chúng bao bọc ở mức 256 = 0.
status
quá trình con thông quawait(2)
hoặc một cái gì đó.