900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux :signal函数 和父子进程间的通信(结合signal函数)

linux :signal函数 和父子进程间的通信(结合signal函数)

时间:2023-03-12 06:21:49

相关推荐

linux :signal函数 和父子进程间的通信(结合signal函数)

目录

一 回顾二signal 函数1 signal 函数的剩下两种用法三 父子进程间的通信(结合signal函数)四 父子进程间的通信出现僵尸进程的处理

一 回顾

1 前面用了 arlarm 函数 设置了定时 到了之后内核才会发送信号 2 和pause函数在不结束前 进程接收的信息都是睡眠状态 3 如果用ctrl+c 结束 它的状态就不存在了。

二signal 函数

这个函数分解一下

他有三个方法 先用第三种

自定义函数 处理函数指针

选择信号 (参数一 )

kill -l

#include <stdio.h>#include <unistd.h>#include <string,h>#include <stdlib.h>void msignal(int SIG_ALRM){int i=0;while(i<10){i++;printf("i======%d SIG_ALRM====%d\n",i,SIG_ALRM);sleep(1);}}int main(){int i=0;signal(14,mysignal);alarm(7);while(i<10){i++;printf("I======%d\n",i);sleep(1);}return 0;}

1先定时7 秒 之后 去处理信号函数 处理完了 接着执行 定时后生效的 i++2 定时7秒----信号函数 -----处理定时7秒后剩下的3 信号函数相当于一个中断函数

1 signal 函数的剩下两种用法

SIG_IGN: 忽略 alarm 信号 SIG_DFL :默认为alarm 信号 处理

#include <stdio.h>#include <unistd.h>#include <string,h>#include <stdlib.h>void msignal(int SIG_ALRM){int i=0;while(i<10){i++;printf("i======%d SIG_ALRM====%d\n",i,SIG_ALRM);sleep(1);}}int main(){int i=0;signal(14,SIG_IGN);alarm(7);while(i<10){i++;printf("I======%d\n",i);sleep(1);}return 0;}

不受定时影响

#include <stdio.h>#include <unistd.h>#include <string,h>#include <stdlib.h>void msignal(int SIG_ALRM){int i=0;while(i<10){i++;printf("i======%d SIG_ALRM====%d\n",i,SIG_ALRM);sleep(1);}}int main(){int i=0;signal(14,SIG_DFL);alarm(7);while(i<10){i++;printf("I======%d\n",i);sleep(1);}return 0;}

按照alarm 的设置处理

三 父子进程间的通信(结合signal函数)

查看 发送信号 序号 kill -l

10 :用户序号 (usr1)

#include <stdio.h>#include <unistd.h>#include <string,h>#include <stdlib.h>void msignal(int SIG_ALRM){int i=0;while(i<10){printf("i======%d SIG_ALRM====%d\n",i,SIG_ALRM);sleep(1);i++;}}int main(){int i=0;signal(10,mysignal);pid_t pid;pid=fork();if(pid>0){while(1){printf("I======%d\n",i);sleep(1); i++;} }if(pid==0){sleep(10);//细节 保证 父进程 占用资源的办法 让子进程休眠一段时间kill(getppid(),10);//10 :用户序号 (usr1)}return 0;}

开始应该是马上处理 信号的 因为父进程 从main开始执行 因为读取太快了突然发生抢占 所以就显示0 1没有显示 可能是到了那时候 去处理信号函数了

细节 保证 父进程 占用资源的办法 让子进程休眠一段时间因为父进程一直在处理事件 就抛弃了子进程 导致 子进程会变成僵尸进程了

打印同时 查看了 状态 变成了僵尸进程了

四 父子进程间的通信出现僵尸进程的处理

1 注意 直接把wait 函数 放在 父进程 会发生阻塞 行不通 2 直接再写一个信号处理函数 让他在中断处理 (中断函数===信号处理函数)

可以这么写

当子进程退出后并且告知内核 内核发送父进程 父进程处理退出信号 在退出信号函数 里 写wait(NULL);

子进程退出 函数 exit(0)exit(0也是一个信号 对应的是 序号 17

#include<signal.h>#include <stdio.h>#include<sys/types.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>void msignal(int SIG_ALRM){int i=0;while(i<10){printf("i======%d SIG_ALRM====%d\n",i,SIG_ALRM);sleep(1);i++;}}void msignal1(int SIG_ALRM){wait(NULL); }int main(){int i=0; pid_t pid;signal(10,mysignal);signal(17,mysignal1);//解决僵尸进程pid=fork();if(pid>0){while(1){printf("I======%d\n",i);sleep(1); i++;} }if(pid==0){sleep(10);kill(getppid(),10);exit(0);//exit(0也是一个信号 对应的是 序号 17 }return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。