博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 信号捕捉
阅读量:5876 次
发布时间:2019-06-19

本文共 2027 字,大约阅读时间需要 6 分钟。

pause函数pause函数挂起调用它的进程,直到有任何消息到达。调用进程必须有能力处理送达的信号,否则信号的默认部署就会发生。int pause(void);只有进程捕获到一个信号的时候pause才返回,如果递送到的信号引发了对信号的处理,那么处理工作将在pause返回前执行。pause总是返回-1,并且将变量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(0)或者abort()),则继续执行在捕获到信号时进程正在执行的正常指令序列。在信号处理程序中,不能判断捕捉到信号是进程正在何处执行。编译后执行该程序用kill命令发送信号给该程序--kill命令作用其实不是‘杀死’的意思,而是将指定信号发送给指定进程。--kill [-s signal|-p] [--] pid...--kill可以用-s指定具体的信号发给指定的进程。--kill -s 2 2365  (SIGINT的值就是2,这个命令是将SIGINT信号发送给指定进程)--信号都是整数
//捕捉信号#include 
#include
#include
#include
#include
#include
void catch_signal(int sign){ switch(sign) { case SIGINT: printf("SIGINT signal\n"); exit(0); break; case SIGALRM: printf("SIGALRM signal\n"); break; }}int main(int arg, char *args[]){ signal(SIGINT,catch_signal); signal(SIGALRM,catch_signal); int i=0; while(1) { printf("hello god %d\n",i++); sleep(1); } return 0;}
.SUFFIXES:.c .oCC=gccSRCS=hello.cOBJS=$(SRCS:.c=.o)EXEC=tecstart:$(OBJS)    $(CC) -o $(EXEC) $(OBJS)    @echo "^_^----OK----^_^".c.o:    $(CC) -Wall -g -o $@ -c $

 

转载地址:http://vzkix.baihongyu.com/

你可能感兴趣的文章
Kuuga——转化任何 Web 页面为桌面应用的跨平台工具
查看>>
Java11都出来了还要学Java8新特性吗?
查看>>
AWS光缆被挖后对架构设计的一点总结(一)
查看>>
React Hooks ---useMemo
查看>>
ios 3DTouch初识
查看>>
SpringBoot使用Sharding-JDBC读写分离
查看>>
宅社AcgClub API上线
查看>>
如何用 Vue-CLI 3 打包 npm 包
查看>>
ElementUI Table组件,如何在多页数据下勾选多行
查看>>
什么是Scala Scala如何学习和入门之我的个人学习经验以及相关实战
查看>>
golang 指针实践
查看>>
Android JNI 代码自动生成
查看>>
elemetui中好用的小技巧
查看>>
Laravel 文件上传提示 “The file "" deos not exits ” ,但确实已经上传了文件
查看>>
4.4 -4.5
查看>>
一天一个知识点 - 浅谈 JavaScript 原型链
查看>>
【变态需求】bootstrapTable列排序-选择正序倒序不排序
查看>>
Interface实现Fragment之间的通讯
查看>>
基于Vue+Canvas移动端的简单水印制作
查看>>
微信小游戏学习笔记 - 使用three.js 绘制一个旋转的三角形
查看>>