![](/img/trans.png)
[英]What is the use of ignoring `SIGCHLD` signal with `sigaction(2)`?
[英]Signal and SIGCHLD, what does it do?
我被要求找到這個問題的所有可能的輸出:
#define N 4
int val = 9;
void handler(sig) {
val += 3;
return;
}
int main() {
pid_t pid;
int i;
signal(SIGCHLD,handler);
for (i=0;i<N;i++) {
if ((pid =fork()) == 0) {
val -= 3;
exit(0);
}
}
for (i=0;i<N;i++) {
waitpid(-1,NULL,0);
}
printf("val = %d\n",val);
}
我不知道行信號(SIGCHLD,處理程序)做什么。 我只發現以下內容:
SIGABRT - abnormal termination.
SIGFPE - floating point exception.
SIGILL - invalid instruction.
SIGINT - interactive attention request sent to the program.
SIGSEGV - invalid memory access.
SIGTERM - termination request sent to the program.
SIGCHLD是做什么的? 您也可以在這個問題中解釋for循環嗎?
我需要哪些必要的庫來編譯和運行此代碼?
當您從父進程派生子進程時,會設置SIGCHLD,但不會執行處理程序功能。 子項退出后,它將觸發SIGCHLD並因此導致處理程序函數中的代碼執行...
奇怪的程序。
我想向您展示的是SIGCHLD導致的原因以及子進程更改子進程中的變量對父級沒有影響。
當fork()時,您將創建一個子進程。 聽起來有點熟? 父進程(稱為fork()的進程)接收信號。 處理程序被執行。 當您運行程序時,您應該會看到21。
這是因為每次信號處理程序執行9 +(3 * 4)= 21時,val都會增加3。 該代碼創建了四個子代。
子進程
val-= 3; 退出(0);
遞減值 但是因為這是在另一個進程中發生的,而不是在原始子進程中發生的,所以它沒有接觸“原始” val變量,因為它具有自己的本地副本。
我相信@jim mcnamara的答案不會列出所有可能的輸出。
1 <= k <= 4的9+(3 * k)應該是可能的,因為多個信號可以折疊為一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.