【linux高级环境编程学习笔记二】信号通信
来源:互联网 发布:美食软件哪个好 编辑:程序博客网 时间:2024/05/22 06:08
今天学习了进程间通信的第二种方式,使用信号进行通信。
一 信号类型
linux中共有31种信号类型,常见的几种信号类型如下所示:
SIGHUP:从终端上发出的结束信号SIGINT:来自健盘的中断信号(ctrl+c)SIGKILL:该信号结束接收信号的进程SIGTERM: kill命令发出的信号SIGCHLO:标识子进程停止或结束的信号SIGSTOP:来自健盘(ctrl+z)或调试程序的停止执行信号
二 常见信号处理方式
当某信号出现时,通常会采用以下几种常见的处理方式:
1. 忽略此信号
大多数都是采用这种信号处理方式,但是有两种信号不能被忽略,SIGKILL SIGSTOP。
2.执行系统默认的动作
系统对于大多数信号采取的动作是终止该进程。
3.执行用户希望的动作
通知内核,当某种信号出现是,调用一个用户函数,在这个用户函数中,执行用户希望的动作。
三 信号发送函数
在linux中可以使用以下几个函数向某进程发送信号:
1. kill
int kill(pid_t pid, int signo)
pid参数为接受信号进程的pid,signo为需要发送信号的类型。
2. raise
int raise(int signo)
对比raise和kill函数的原型可以看出,kill能向所有进程发送信号,而raise只能向本进程发送信号。
3. kill命令
关于kill命令的使用方法,可以在终端里面执行man kill查看,在此略过。
4. alarm函数
unsigned int alarm(unsigned int seconds)
在seconds秒之后,会向本进程发送SIGARM信号
四 信号处理函数
当某种信号出现时,若希望能执行用户所希望的动作,则需要使用signal函数来制定信号处理函数。signal函数的函数原型为void*(signal(int signo, void*(func(int))))(int),函数原型看起来复杂,使用起来却比较简单,在后面会有例子。
func的可能的值如下:
1. SIG_IGN: 忽略此信号;
2. SIG_DFL: 按系统默认的动作去处理;
3. 信号处理函数名:使用该函数去处理。
此外,pause函数是使进程挂起,直至捕捉到一个信号,并且只有执行了一个信号处理函数之后,挂起才结束。
五 例子
#include <signal.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>void my_function(int signalno){switch(signalno){case SIGINT: printf("Catch a SIGINT signal\n");break;case SIGQUIT: printf("Catch a SIGQUIT signal\n");break;default: printf("error!\n");break;}}int main(int args, char* argv[]){printf("Waiting for signal SIGINT OR SIGQUIT\n");signal(SIGINT,my_function);signal(SIGQUIT,my_function);pause();exit(0);}
使用ps -aux查看本进程pid之后,再用kill命令发送信号:
kill -SIGQUIT 13253
运行结果如下:
Waiting for signal SIGINT OR SIGQUIT
Catch a SIGQUIT signal
欢迎关注新浪微博:ThreadX
共同学习,共同进步!
- 【linux高级环境编程学习笔记二】信号通信
- 【linux高级环境编程学习笔记一】管道通信
- 【linux高级环境编程学习笔记三】共享内存通信
- linux信号(二)--unix环境高级编程读书笔记
- Unix环境高级编程学习笔记(六) 信号机制
- 【linux高级环境编程学习笔记四】消息队列进程通信
- 《UNIX环境高级编程》笔记--可靠信号
- 《UNIX环境高级编程》笔记--信号集
- Unix环境高级编程学习笔记(二) 文件IO
- Unix环境高级编程学习笔记(十二) 高级进程间通信
- Unix环境高级编程学习笔记(十二) 高级进程间通信
- UNIX环境高级编程-第10章- 信号 - 二
- unix环境高级编程之信号篇(二)
- UNIX环境高级编程第十章信号 读后笔记
- 《UNIX环境高级编程》笔记--信号及其处理函数signal
- 《UNIX环境高级编程》笔记-线程和信号
- UNIX环境高级编程(阅读笔记)---多线程信号
- Unix环境高级编程(阅读笔记)----可靠信号
- LeetCode题解:Copy List with Random Pointer
- 专访:InMobi全球CEO Naveen Tewari
- 从真实案例出发:如何在协作开发中避免误解!
- SQL基本操作 查询 排序 函数 ADO.net
- MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
- 【linux高级环境编程学习笔记二】信号通信
- Node.js 第三方包的安装、升级、卸载,以及包依赖管理
- 什么是嵌入式?
- Linux 内核 简介
- 鼠标插上没有反应?
- 系统数据库的作用
- Oracle DB 使用RMAN恢复目录
- 专访Pebble智能手表创始人:Pebble是这样诞生的
- 数据结构总结