Linux 信号捕捉
pause函数
pause函数挂起调用它的进程,直到有任何消息到达。
调用进程必须有能力处理送达的信号,否则信号的默认部署就会发生。
int pause(void);
只有进程捕获到一个信号的时候pause才返回,如果递送到的信号引发了对信号的处理,那么处理工作将在pause返回前执行。
pause总是返回-,并且将变量errno设置为EINTR。
发送信号和捕获信号是相辅相成的。
每个进程能够决定响应除了SIGSTOP和SIGKILL之外的其他所有信号。
SIGSTOP和SIGKILL不能被捕获或者忽略。
捕获信号不是真的去捕获它,而是等待信号被发送过来。
当执行一个程序的时候,所有信号的状态都是系统默认或者忽略。
当一个进程调用fork的时候,其子进程继承父进程的信号处理方式,所以信号捕捉函数的地址在子进程中是有意义的,
定义信号处理器
某些情况下,一个信号的默认动作就是所希望的行为。但更多场合下,你可以改变默认行为或者执行额外的代码。
如果想改变默认行为就必须定义并安装一个自动的信号处理器。
指向函数的指针
--可以用指针变量指向整型变量、字符串、数组、结构体、也可以指向一个函数。
--一个函数在编译时被分配一个入口地址,这个入口地址被称为函数指针。
--可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
回调函数
--回调函数就是一个通过函数指针调用的函数。
--如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
--回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应。
--windows编程下的窗口过程就是典型的回调函数。
signal函数
--UNIX/Linux处理信号最常用的接口是signal函数
.在命令行使用kill命令,向指定进程发送信号。
--使用kill函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal函数一般用于捕捉信号,其功能是为一个信号注册一个回调函数。
第一个参数signum一般就是系统提供的信号,表示要捕捉这个信号。
第二个参数指定类型的函数指针(typedef void (*FUNC)(int)),该函数有个int型参数,int代表捕获到的信号值。
捕捉多个信号需要使用多个signal()函数 进程捕捉到信号并对信号进行处理时,进程正在执行的指令序列就被信号处理程序临时中断。它首先执行该信号处理程序中的指令。
如果信号处理程序返回(没有调用exit()或者abort()),则继续执行在捕获到信号时进程正在执行的正常指令序列。
在信号处理程序中,不能判断捕捉到信号是进程正在何处执行。 编译后执行该程序
用kill命令发送信号给该程序
--kill命令作用其实不是‘杀死’的意思,而是将指定信号发送给指定进程。
--kill [-s signal|-p] [--] pid...
--kill可以用-s指定具体的信号发给指定的进程。
--kill -s 2 2365 (SIGINT的值就是2,这个命令是将SIGINT信号发送给指定进程)
--信号都是整数
//捕捉信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h> void catch_signal(int sign)
{
switch(sign)
{
case SIGINT:
printf("SIGINT signal\n");
exit();
break;
case SIGALRM:
printf("SIGALRM signal\n");
break;
}
} int main(int arg, char *args[])
{
signal(SIGINT,catch_signal);
signal(SIGALRM,catch_signal);
int i=;
while()
{
printf("hello god %d\n",i++);
sleep();
}
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
EXEC=tec start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS)
@echo "^_^----OK----^_^"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)
Linux 信号捕捉的更多相关文章
- Linux控制脚本:信号捕捉,作业控制,调整谦让度,以及计划任务
1.关于信号以及信号捕捉 (1) $ ps -au可以用来查看所有作业,包括暂停的和停止的,当然还有正在运行的. 在STAT这一列表示各个作业的状态,S表示Stop,R表示Run,T表示被追踪的或停 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- Linux系统编程—信号捕捉
前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式: 忽略: 捕捉. 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作.下面详细介绍两个信 ...
- Linux下捕捉信号
关于 信号signal的知识铺垫 点这里 信号由三种处理方式: 忽略 执行该信号的默认处理动作 捕捉信号 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个自定义函数,这称为捕捉信号. 进程收 ...
- 僵尸进程学习 & 进程状态列表 & Linux信号学习
参考这篇文章: http://www.mike.org.cn/articles/treatment-of-zombie-processes-under-linux/ 在Linux进程的状态中,僵尸进程 ...
- Linux信号(signal) 机制分析
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- [置顶] Linux信号相关笔记
最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...
- 利用linux信号机制调试段错误(Segment fault)
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...
- 非常好的一篇对linux信号(signal)的解析 (转载)【转】
转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...
随机推荐
- 初识 Android
创建博客有一年的时间了,一直没把它用起来,颇感惭愧.近日突感有写博客的冲动,更可怕的是这种冲动似乎比我体内的洪荒之力更为凶猛.于是乎,这篇博客悄然诞生.废话不多说,进入正题--初识Android. 这 ...
- storyBoard配置错误导致崩溃 superview]: unrecognized selector...
控制台打印崩溃原因 [TaskStartVC superview]: unrecognized selector sent to instance RT TaskStartVC是一个同storyBoa ...
- iOSQuartz2D-03-定制个性头像
效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘制一 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- CFStringTransform
Mattt Thompson撰写. Ricky Tan翻译. 发布于2012年8月6日关于一种语言好不好用,你只需要衡量以下两种指标: API 的统一性String 类的实现质量NSString 是基 ...
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记
想对PickerView进行操作,只能在代码中操作. 下面 ,再添加三个label组件,然后将所有组件配置到代码中(看代码),然后要实现对PickerView的操作,就要实现它的DataSource协 ...
- HTML页面定时跳转方法
1)html的实现 <head> <meta http-equiv="refresh" content="5;url=hello.html"& ...
- iOS开发者必备的10款工具
当前iOS和Android两大移动操作系统“二足鼎立”,几乎覆盖了市面上大部分的智能手机.相比Android,iOS开发适配更简单,且随着各种实用工具和Swift语言的出现,iOS开发门槛地降低,开发 ...
- openstack kilo compute更新后报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not supported
前几天在compute节点更新openstack的包后,发现报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not suppo ...
- Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例
最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...