参考书籍:unxi环境高级编程
信号函数:
<span style="font-family:Microsoft YaHei;font-size:18px;">typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); </span>
其原型为:
<span style="font-family:Microsoft YaHei;font-size:18px;">void (*signal(int signum,void (*handler)(int))) (int);</span>
我们一般都是用第一个,也就是通过typedef改写过的。
注意:signal函数我一般认为其是向内核注册当前进程收到信号的处理的方式。
signal(SIGINT,handler);
参数说明:
signum : 指定信号
handler : SIG_IGN忽略该信号,SIG_DFL采用系统默认方式处理信号,自定义的信号处理函数指针。
理解实际的例子是学习的最好方式:
例子一:
通过异步方式,给子进程收尸
注意:子进程在终止时会给父进程发SIGCHLD,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需要专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> void child_exit_handler(int signum) { if(signum == SIGCHLD) { printf("Child exit.\n"); wait(NULL); } } int main() { int pid; int i = 0; //想内核注册,处理 SIGCHLD信号的方式 signal(SIGCHLD,child_exit_handler); if((pid = fork()) < 0) { perror("Fail to fork"); exit(EXIT_FAILURE); }else if(pid == 0){ for(i = 0;i < 5;i ++) { printf("child loop.\n"); sleep(1); } }else{ for(i = 0;i < 5;i ++) { printf("Father loop.\n"); sleep(2); } } exit(EXIT_SUCCESS); }
运行结果如下:
[[email protected] test]$
gcc test.c
[[email protected] test]$ ls
a.out test.c
[[email protected] test]$ ./a.out
child loop.
Father loop.
child loop.
Father loop.
child loop.
child loop.
Father loop.
child loop.
Child exit.
Father loop.
Father loop.
[[email protected] test]$
时间: 2024-10-16 13:50:20