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

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