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

目录

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

一 回顾

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

二signal 函数

在这里插入图片描述

这个函数分解一下  

在这里插入图片描述

他有三个方法 先用第三种 

在这里插入图片描述

自定义函数 处理函数指针 

选择信号 (参数一 )

 kill -l 

在这里插入图片描述
在这里插入图片描述

#include 
#include 
#include 
#include 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 
#include 
#include 
#include 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 
#include 
#include 
#include 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 
#include 
#include 
#include 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
#include 
#include
#include 
#include 
#include 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;}

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部