这里我编写了一个信号处理函数,名为相应地,该处理程序使用信号函数注册到内核,当我的子进程生成信号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
我的问题是为什么即使我已经使用信号函数来注册我的处理程序函数,处理程序也没有被调用。只有当我的处理程序未注册时才会发生这种情况。为什么?
答案1
你说“父进程正在等待”,并且等待了几个周期,但随后你“返回0”,导致它退出。如果您想接收 SIGCHLD,您需要确保您的父进程在子进程执行其操作之前不会退出。
最简单的方法是:在以下内容之前插入一行return 0
:
sleep(10);
这将导致您的家长等待长达 10 秒钟。
你会注意到你的父母不实际上等待10秒。原因留给读者作为练习(提示:阅读手册页;-)