Linux 信号详解二(信号分类,信号处理,kill)
2024-10-14 14:11:39
信号分类
信号分为可靠信号和不可靠信号
不可靠信号的缺点 ①:处理完信号,需要重新再注册信号;②信号可能丢失。
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 ;
}
最新文章
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
- 深入理解JavaScript中 fn() 和 return fn() 的区别
- Java——Swing
- 黑马程序员——【Java基础】——网络编程
- java学习第四天
- 软件工程个人项目-Word frequency program by11061167龚少波
- UILabel 根据内容的多少来计算label的frame
- System.Data.DbType的字符串和数据库中字符串类型对应关系
- ASP.NET页面之间数据传递的几种方法
- java1.8新特性
- ORA-04028: cannot generate diana for object xxx
- [NOIp2018提高组]赛道修建
- angular 2 - 001 ng cli的安装和使用
- IP通信基础学习第二周
- centos7.4 开启ftp服务
- LeetCode Factorial Trailing Zeroes Python
- linux expect 的使用
- HDU 4720 Naive and Silly Muggles (简单计算几何)
- Oracle中用户和方案的区别
- 用IntelliJ IDEA 配置Maven并部署Maven工程到Tomcat(Windows中)