信号分类
信号分为可靠信号和不可靠信号
不可靠信号的缺点 ①:处理完信号,需要重新再注册信号;②信号可能丢失。
Linux已经对缺点①做了优化,现在的不可靠问题主要指的是信号可能丢失
信号还可以分为实时信号和非实时信号--一般不可靠信号指的是前32种信号,这32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作
--可靠信号指的后32种信号
--非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。
信号处理
进程对信号的三种响应
.忽略信号
--不采取任何操作,有两个信号不能被忽略:SIGKILL(9号信号)和SIGSTOP。
--如果进程可以忽略这两个信号,系统管理无法杀死,暂停进程,无法对系统进行管理。
--SIGKILL(9号信号)和SIGSTOP信号是不能被捕获的
.捕获并处理信号
--内核终端正在执行的代码,转去执行先前注册过的处理程序
.执行默认操作
--默认操作通常是终止进程,这取决于被发送的信号
信号发送
发送信号的函数有kill和raise
区别:kill既可以向自身发送信号,也可以向其他进程发送信号
raise函数向进程自身发送信号
int kill(oid_t pid,int sig)
参数组合解释
pid> 将信号sig发给pid进程
pid= 将信号sig发给组进程
pid=- 将信号sig发送给所有进程,调用者进程有权限发送的每一个进程(除了1号进程之外,还有它自身)
pid<- 将信号sig发送给进程组pid(绝对值)的每一个进程
//kill 函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h> void catch_signal(int sign)
{
switch(sign)
{
case SIGINT:
printf("accept signal!\n");
break;
default:
break;
}
} int main(int arg,char *args[])
{
//注册信号
if(signal(SIGINT,catch_signal)==SIG_ERR)
{
perror("signal error");
return-;
}
//注意:如果在fork之前安装信号,子进程会继承信号
pid_t pid=;
pid=fork();
if(pid==-)
{
printf("fork() failed ! error message:%s\n",strerror(errno));
return -;
}
if(pid==)
{
printf("child runing!\n");
//kill(getppid(),SIGINT);//向父进程发送信号
kill(,SIGINT);//向进程组内所有进程发送信号(父子进程在同一个进程组中)
//getpgrp()获取进程组的pid,此处进程组ID就是父进程的pid
/*killpg向一个进程组所有进程发送信号,第一个参数是进程组组长ID*/
killpg(getpgrp(),SIGINT);
exit();
}
printf("parent is runing!\n"); //等待子进程
int status=,ret=;
while()
{
ret=wait(&status);
if(ret==-)
{
if(errno==EINTR)
{
continue;
}
break;
}
}
printf("game over!\n");
return ;
}

最新文章

  1. CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
  2. 深入理解JavaScript中 fn() 和 return fn() 的区别
  3. Java——Swing
  4. 黑马程序员——【Java基础】——网络编程
  5. java学习第四天
  6. 软件工程个人项目-Word frequency program by11061167龚少波
  7. UILabel 根据内容的多少来计算label的frame
  8. System.Data.DbType的字符串和数据库中字符串类型对应关系
  9. ASP.NET页面之间数据传递的几种方法
  10. java1.8新特性
  11. ORA-04028: cannot generate diana for object xxx
  12. [NOIp2018提高组]赛道修建
  13. angular 2 - 001 ng cli的安装和使用
  14. IP通信基础学习第二周
  15. centos7.4 开启ftp服务
  16. LeetCode Factorial Trailing Zeroes Python
  17. linux expect 的使用
  18. HDU 4720 Naive and Silly Muggles (简单计算几何)
  19. Oracle中用户和方案的区别
  20. 用IntelliJ IDEA 配置Maven并部署Maven工程到Tomcat(Windows中)

热门文章

  1. eclipse编码格式设置
  2. Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)
  3. 学习 MySQL-DBA常用SQL汇总
  4. MicroStation VBA基础
  5. post请求报文
  6. 网络编程3--毕向东java基础教程视频学习笔记
  7. python 打印对象的所有属性值
  8. w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法
  9. HttpModule
  10. ORA-04031错误导致宕机案例分析