一、SIGCHLD信號
1. SIGCHLD簡介
SIGCHLD的產生條件:
- 子進程終止
- 子進程接收到SIGSTOP信號停止時
- 子進程處于停止狀態,接收到SIGCONT后喚醒
注意:通過signal(SIGCHLD, SIG_IGN)通知內核對子進程的結束不關心,由內核回收。如果不想讓父進程掛起,可以在父進程中加入一條語句:signal(SIGCHLD,SIG_IGN);表示父進程忽略SIGCHLD信號,該信號是子進程退出的時候向父進程發送的。
?
2. 測試代碼:
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void sys_err(char* str)
{perror(str);exit(1);
}void do_sig_child(int signo)
{int status;pid_t pid;while ((pid = waitpid(0, &status, WNOHANG)) > 0){if (WIFEXITED(status))printf("---------------------------child %d exit %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("child %d cancel signal %d\n", pid, WTERMSIG(status));}
}int main()
{pid_t pid;int i;for (i = 0; i < 10; i++){if ((pid = fork()) == 0)break;else if (pid < 0)sys_err("fork");}if (pid == 0) //子進程{int n = 1;while (n--){printf("child ID %d\n", getpid());sleep(1);}return i + 1;}else if (pid > 0) //父進程{struct sigaction act; act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGCHLD, &act, NULL); while (1){printf("parent ID %d\n", getpid());sleep(1);}}return 0;
}
輸出結果:
?
?
?
2. 測試代碼:
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void sys_err(char* str)
{perror(str);exit(1);
}void do_sig_child(int signo)
{int status;pid_t pid;if((pid = waitpid(0, &status, WNOHANG)) > 0){if (WIFEXITED(status))printf("---------------------------child %d exit %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("child %d cancel signal %d\n", pid, WTERMSIG(status));}
}int main()
{pid_t pid;int i;for (i = 0; i < 10; i++){if ((pid = fork()) == 0)break;else if (pid < 0)sys_err("fork");}if (pid == 0) //子進程{int n = 1;while (n--){printf("child ID %d\n", getpid());sleep(1);}return i + 1;}else if (pid > 0) //父進程{struct sigaction act; //SIGCHLD阻塞act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGCHLD, &act, NULL); //解除對SIGCHLD的阻塞 while (1){printf("parent ID %d\n", getpid());sleep(1);}}return 0;
}
輸出結果:
?
?
?
?
三、參考資料:
- ?linux下的僵尸進程處理SIGCHLD信號
- 孤兒進程與僵尸進程[總結]