用戶關心:兩個獨立程序(進程)並發運行時,echo $? 獲取的退出碼是否會相互干擾?
不會干擾。 每個進程擁有獨立的退出碼,Shell 變量 $? 只保存最近一次前台命令的退出狀態。兩個並行程序的退出碼互不影響,關鍵在於如何正確等待並捕獲特定進程的退出碼。
| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
| 啟動後不等待,直接查 $? | 獲取的是上一條命令(如啟動命令本身)的退出碼 | 使用 wait PID 等待特定進程 |
| 並行啟動多個後台任務,只 wait 一次 | 只能獲取第一個結束任務的退出碼 | 逐個 wait PID 或用 wait 循環收集所有 |
| 假設先啟動的先結束 | 調度不確定,可能導致邏輯錯誤 | 不依賴執行順序,以 PID 為唯一標識 |
#!/bin/bash
# 啟動兩個獨立任務
./program1 & pid1=$!
./program2 & pid2=$!
# 等待並記錄各自退出碼
wait $pid1; ret1=$?
wait $pid2; ret2=$?
echo "Program1 exited with: $ret1"
echo "Program2 exited with: $ret2"
# 根據業務邏輯判斷整體成功與否
if [ $ret1 -eq 0 ] && [ $ret2 -eq 0 ]; then
exit 0
else
exit 1
fi
若在單一進程內使用 std::thread 或 std::async,主線程可通過 future::get() 或 thread::join() 獲取返回值/異常,互不干擾。進程級返回碼僅由 main 的返回值或 exit() 參數決定。