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