Fork
為什麼信號函式不能呼叫我的信號處理程序?
在這裡,我編寫了一個名為相應的信號處理程序函式,該處理程序使用信號函式註冊到核心,當我的子程序生成信號
handler
時將呼叫該信號函式。SIGCHLD
這是我的程式碼#include<stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void handler(int sig){ pid_t pid; printf("The name of the PID=%d\n",getpid()); pid=wait(NULL); printf("Pid %d exited \n",pid); } int main(){ signal(SIGCHLD,handler) if(!fork()){ printf("This is the child process %d\n",getpid()); exit(1); } printf("Parent pid is %d\n",getpid()); printf("The parent is waiting"); return 0; }
輸出是:
Parent pid is 4356 The parent is waitingThis is the child process 4357
我的問題是為什麼即使我已經使用信號功能來註冊我的處理程序功能,也沒有呼叫處理程序。這僅在我的處理程序未註冊時發生。為什麼?
你說“父母正在等待”,它會持續幾個週期,但隨後你會“返回 0”,導致它退出。如果你想收到 SIGCHLD,你需要確保你的父母在孩子做它的事情之前不會退出。
最簡單的方法:在您的
return 0
:之前插入一行sleep(10);
這將導致您的父母等待長達 10 秒。
您會注意到您的父母實際上並沒有等待 10 秒。原因留給讀者作為練習(提示:閱讀手冊頁 ;-)