SIGHLD信号及其应用
来源:互联网 发布:网络直播相关法律出台 编辑:程序博客网 时间:2024/06/01 10:40
SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态, 则应捕捉此信号。
如何应用SIGCHLD信号 异步处理僵死进程?
1 #include<stdio.h>
2 #include<signal.h>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<assert.h>
6 //避免僵尸进程
7 void fun(int);
8 int main()
9 {
10 pid_t pid=fork();
11 assert(pid!=-1);
12 if(pid==0)
13 {
14 printf("child\n");
15 kill(getppid(),SIGINT); //kill函数是向进程发送某种信号 int kill(pid_t pid,int sig)
16 }
17 else
18 {
19 signal(SIGCHLD,fun);
20 printf("father begin\n");
21 //信号处理时唤醒了sleep,
22 sleep(1000); //sleep是为了产生等待子进程结束产生僵死进程
23 printf("father over\n");
24 }
25 }
26 void fun(int signal)
27 {
28 pid_t pid= wait(NULL); //wait函数分析是否当前进程的某个子进程已经退出,若有wait就收集这个子进程的信息,并把它销毁后返回,wait返回值是待处理子进程的pid
29 }
kill函数: 用于向任何进程组或进程发送信号。
int kill (pid_t pid,int sig)
参数:
pid:可能选择有以下四种:
1、pid>0时,向pid指定的进程发送信号。
2、pid==0,信号将送往所有与调用kill()进程的那个进程属同一个使用组的进程(发送给同一进程组的所有进程)
3、pid=-1,信号将送往所有调用进程有权给其发送信号的进程,除了进程init。
4、pid<-1,信号将送往以-pid为组标识的进程。
int raise(int signum):向调用这个函数的进程发送一个signum指定的信号
SIGKILL信号不允许修改响应方式。
进程替换:用新的可执行文件替换进程的主体(代码、数据、资源)
进程替换方法:execl(char*pathname,char*argv1,char*argv2,....,(char*)0);
execx(char*pathname,char*argv[]);
写时拷贝:fork产生子进程之后,并不会完全将父进程(代码,栈区,堆区,全局变量区)拷贝一份,但是内核会将这些区域设置为只读,当父子进程中任意一个进程试图修改数据时,才会将数据所在“页”拷贝一份。
- SIGHLD信号及其应用
- 信号互相关及其应用
- 信号(互)相关及其应用
- 信号(互)相关及其应用
- linux信号及其含义
- 信号理论: 信号集及其映射
- 信号完整性问题及其解决方法
- linux 各种信号及其含义
- 信号两及其相关函数
- linux 各种信号及其含义
- Linux信号捕捉及其处理
- 信号总结及其实现代码
- 35-标准信号及其不可靠性
- Linux信号高级应用
- linux信号实现浅析1--信号及其数据结构
- Linux 常用SIG信号及其键值
- Linux下SIGPIPE信号及其处理
- Linux常用SIG信号及其键值
- vue学习第7天,组件
- 轻松搞定多Offer选择
- 我们怎么过一天,就怎么过一生
- DynamicMethodInvocation值
- Android源码及SDK国内镜像下载
- SIGHLD信号及其应用
- Git相关操作二
- SIFT特征点描述子生成(生成特征向量)
- spring AOP使用注解无法执行的问题
- spring的value获取不到值
- 全局异常捕获
- SpringBoot学习-持久化Quartz定时任务管理
- Git相关操作三
- 喜欢英语却不愿意付出行动