當Linux子進程異常退出時,通常會產生一個信號(signal),通知父進程子進程已經退出
signal()
或sigaction()
函數為SIGCHLD
信號安裝一個信號處理器。這個處理器將在子進程異常退出時被調用。#include<signal.h>
#include <sys/wait.h>
void handle_sigchld(int sig) {
// 在這里處理子進程的退出
}
int main() {
signal(SIGCHLD, handle_sigchld);
// 或者使用 sigaction() 函數
// struct sigaction sa;
// sa.sa_handler = handle_sigchld;
// sigemptyset(&sa.sa_mask);
// sa.sa_flags = SA_RESTART;
// sigaction(SIGCHLD, &sa, NULL);
// ... 其他代碼
}
waitpid()
或wait()
函數來獲取子進程的退出狀態。這樣你可以檢查子進程是否因為異常而退出,并獲取相關信息。void handle_sigchld(int sig) {
pid_t pid;
int status;
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
if (WIFEXITED(status)) {
printf("子進程 %d 正常退出,退出碼: %d\n", pid, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("子進程 %d 因信號 %d 而異常退出\n", pid, WTERMSIG(status));
// 在這里處理子進程的異常退出,例如重啟子進程
}
}
}
注意:在信號處理器中,應避免使用不可重入的函數(non-reentrant functions),因為它們可能會導致死鎖或其他問題。在上面的示例中,我們使用了printf()
,但在實際應用中,你可能需要使用更安全的方法來記錄日志或處理子進程的退出。