目录
一 回顾二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;}