进程间通信_04信号
来源:互联网 发布:直播软件源码 编辑:程序博客网 时间:2024/04/19 03:27
一 概述
信号的作用是通知进程某一特定事件的发生,是一种软件中断。采用异步处理机制,即当信号发送到某个进程中的时候,操作系统会中断进程的正常处理流程,转而去进入信号处理函数进行操作,等信号处理函数完成之后,返回中断处继续执行。
信号的发送:硬件产生(按键 或者 硬件错误) 、软件产生(程序调用kill、alarm等函数)
信号的处理:用户自定义函数处理、系统默认方式处理、忽略。
二 常见的信号
"动作(Action)"栏 的 字母 有 下列 含义:
A 缺省动作是结束进程.
B 缺省动作是忽略这个信号.
C 缺省动作是结束进程, 并且核心转储.
D 缺省动作是停止进程.
E 信号不能被捕获.
F 信号不能被忽略.
信号值动作说明
SIGINT2A从键盘输入的中断
SIGQUIT3C从键盘输入的退出
SIGILL4C无效硬件指令
SIGABRT6C非正常终止, 可能来自 abort(3)
SIGFPE8C浮点运算例外
SIGKILL9AEF杀死进程信号
SIGSEGV11C无效的内存引用
SIGPIPE13A管道中止: 写入无人读取的管道
SIGALRM14A来自 alarm(2) 的超时信号
SIGTERM15A终止信号
SIGUSR130,10,16A用户定义的信号 1
SIGUSR231,12,17A用户定义的信号 2
SIGCHLD20,17,18B子进程结束或停止
SIGCONT19,18,25
继续停止的进程
SIGSTOP17,19,23DEF停止进程
SIGTSTP18,20,24D终端上发出的停止信号
SIGTTIN21,21,26D后台进程试图从控制终端(tty)输入
SIGTTOU22,22,27D后台进程试图在控制终端(tty)输出
信号值动作说明
SIGPOLL
AI/O就绪事件 (Sys V). 等同于SIGIO
SIGPROF27,27,29A系统资源定时器(Profiling timer)超时
SIGSYS12,-,12C用错误参数调用系统例程 (SVID)
SIGTRAP5C跟踪/断点自陷
SIGURG16,23,21B套接口上出现 urgent 情况 (4.2 BSD)
SIGVTALRM26,26,28A虚拟超时时钟 (4.2 BSD)
SIGXCPU24,24,30C超过了CPU时间限制 (4.2 BSD)
SIGXFSZ25,25,31C超过了文件大小限制 (4.2 BSD)
SIGINT2A从键盘输入的中断
SIGQUIT3C从键盘输入的退出
SIGILL4C无效硬件指令
SIGABRT6C非正常终止, 可能来自 abort(3)
SIGFPE8C浮点运算例外
SIGKILL9AEF杀死进程信号
SIGSEGV11C无效的内存引用
SIGPIPE13A管道中止: 写入无人读取的管道
SIGALRM14A来自 alarm(2) 的超时信号
SIGTERM15A终止信号
SIGUSR130,10,16A用户定义的信号 1
SIGUSR231,12,17A用户定义的信号 2
SIGCHLD20,17,18B子进程结束或停止
SIGCONT19,18,25
SIGSTOP17,19,23DEF停止进程
SIGTSTP18,20,24D终端上发出的停止信号
SIGTTIN21,21,26D后台进程试图从控制终端(tty)输入
SIGTTOU22,22,27D后台进程试图在控制终端(tty)输出
信号值动作说明
SIGPOLL
SIGPROF27,27,29A系统资源定时器(Profiling timer)超时
SIGSYS12,-,12C用错误参数调用系统例程 (SVID)
SIGTRAP5C跟踪/断点自陷
SIGURG16,23,21B套接口上出现 urgent 情况 (4.2 BSD)
SIGVTALRM26,26,28A虚拟超时时钟 (4.2 BSD)
SIGXCPU24,24,30C超过了CPU时间限制 (4.2 BSD)
SIGXFSZ25,25,31C超过了文件大小限制 (4.2 BSD)
信号值动作说明
SIGEMT7,-,7
SIGSTKFLT-,16,-A协处理器堆栈错误
SIGIO23,29,22AI/O 有效信号 (4.2 BSD)
SIGCLD-,-,18
等同于 SIGCHLD
SIGPWR29,30,19A电源无效 (System V)
SIGINFO29,-,-
等同于 SIGPWR
SIGLOST-,-,-A文件锁丢失
SIGWINCH28,28,20B窗口大小调整信号 (4.3 BSD, Sun)
SIGUNUSED-,31,-A未使用的信号 (将成为 SIGSYS)
SIGEMT7,-,7
SIGSTKFLT-,16,-A协处理器堆栈错误
SIGIO23,29,22AI/O 有效信号 (4.2 BSD)
SIGCLD-,-,18
SIGPWR29,30,19A电源无效 (System V)
SIGINFO29,-,-
SIGLOST-,-,-A文件锁丢失
SIGWINCH28,28,20B窗口大小调整信号 (4.3 BSD, Sun)
SIGUNUSED-,31,-A未使用的信号 (将成为 SIGSYS)
三 信号的产生
1 键盘产生
ctrl+c 产生 SIGINT 信号
ctrl+z 产生 SIGSTP 信号
2 shell命令产生
kill -9 15212 表示发送信号9(SIGKILL)给pid为15212的进程。
3 调用函数产生
(1) kill向进程发送实时信号(包括自己)
#include <sys/types.h>#include <signal.h>int kill( pid_t pid, //发送给哪个进程 int sig ); //发送什么信号,见"常见的信号"//参数pid:>0 表示发送给特定的进程// 0 表示发送给所有和发送信号进程在同一个进程组的进程// <0 表示发送给abs(pid)对应的进程组中的所有进程//返回值:0(发送成功)、-1(发送失败,失败信息见errno)
#include <sys/types.h>#include <signal.h>int sigqueue(pid_t pid, //对那个进程发送 int sig, //发送什么信号 const union sigval val); //处理函数中需要携带什么参数?//返回值:成功返回0;错误返回-1
#include <signal.h>int raise(int signo);//返回值:成功返回 0;否则返回 -1
#include <stdlib.h>void abort(void);
#include <unistd.h>unsigned int alarm( unsigned int seconds ); //参数seconds: >0 定时seconds秒之后产生SIG_ALRM信号// =0 不在产生信号(等于关闭闹钟)
四 信号的捕捉
1 由系统捕捉,程序不做处理,此时会由系统采用默认方法处理。
(1) 没有参数的信号处理
(2) 有参数的信号处理,和一般和sigqueue()配合使用#include <signal.h>typedef void(* sighandler_t)(int);sighandler_t signal(int signal, //信号 sighandler_t handler); //信号对应的处理函数
handler取值:如果对信号不做处理,直接忽略。 取值为 SIG_IGN
如果采用系统默认方式处理信号。 取值为 SIG_DFL
如果,需要执行操作用户自定义的操作,则取值为用户定义的 函数指针。
#include <signal.h>int sigaction(int signo, //信号,为除SIGKILL及SIGSTOP外的任何一个信号; const struct sigaction *act, //对信号的处理结构体 struct sigaction *oact); //用来保存原来对相应信号的处理,可以置为NULL//struct sigaction结构体原型:struct sigaction{ void (*sa_handler)(int signo) ; //只有信号值为参数的处理函数 void (*sa_sigaction)(int signu, siginfo_t *info, void *act) ; //可以携带siginfo_t结构体参数的处理函数,act参数保留不用 sigset_t sa_mask; //指定信号处理过程中哪些信号被阻塞,默认是当前正在处理的信号 int sa_flags; //信号处理相关标志位,比如:传递信息的时候置为SA_SIGINFO void (*sa_restore)(void); //POSIX不在支持,忽略不用}//其中,siginfo_t 的原型:siginfo_t { int si_signo; /* Signal number */ int si_errno; /* An errno value */ int si_code; /* Signal code */ pid_t si_pid; /* Sending process ID */ uid_t si_uid; /* Real user ID of sending process */ int si_status; /* Exit value or signal */ clock_t si_utime; /* User time consumed */ clock_t si_stime; /* System time consumed */ sigval_t si_value; /* Signal value */ int si_int; /* POSIX.1b signal */ void * si_ptr; /* POSIX.1b signal */ void * si_addr; /* Memory location which caused fault */ int si_band; /* Band event */ int si_fd; /* File descriptor */}//sigval就是携带的参数信息,可以是int型也可以是指针。union sigval{ int sival_int; void *sival_ptr;}
五 使用实例
1 没有参数的信号
/************************************************************************* > File Name: testsignal.c > Author: qiaozp > Mail: qiaozongpeng@163.com > Created Time: 2014-9-18 17:12:01 > Step: 1 定义信号处理函数 2 绑定信号 和 处理函数 3 发出信号 ************************************************************************/#include <signal.h>#include<iostream>using namespace std;//1 定义信号处理函数void dealSignal(int signo){ cout << "收到不带参数的信号 : " << signo << endl; return ;}int main(){ //2 绑定信号 和 处理函数 signal(SIGINT, dealSignal); sleep(3); //3 发出信号 raise(SIGINT); return 0;}
2 有参数的信号
/************************************************************************* > File Name: testsigaction.c > Author: qiaozp > Mail: qiaozongpeng@163.com > Created Time: 2014-9-18 17:12:01 > Step: 1 定义信号处理函数 2 绑定信号和处理函数 3 发出信号,携带参数 ************************************************************************/#include <signal.h>#include<iostream>using namespace std;//1 定义信号处理函数void dealSigAction(int signo, siginfo_t* info, void *){ cout << "收到带参数的信号 : " << signo << endl; cout << "参数信息是 : " << info->si_value.sival_int << endl; return ;}int main(){ struct sigaction sigAction; sigAction.sa_sigaction = dealSigAction; sigAction.sa_flags = SA_SIGINFO;//这个是传参的开关,需要设置,否则参数传不过去 //2 绑定信号 和 处理函数 if (sigaction(SIGTSTP, &sigAction, NULL) != 0) { cout << "绑定信号处理函数失败" << endl; } sleep(3); union sigval info; info.sival_int = 10; //3 发送信号 if (sigqueue(getpid(), SIGTSTP, info) != 0) { cout << "发送信号失败" << endl; } return 0;}
1 0
- 进程间通信_04信号
- 进程间通信-信号
- 进程间通信--信号
- 进程间通信--信号
- 进程间通信-信号
- 进程间通信---信号
- 【进程间通信】信号
- 进程间通信----信号
- 【进程间通信】信号
- 信号通信(进程间通信)
- 进程间通信之信号
- 进程间通信:信号机制
- 3、进程间通信-信号
- 进程间通信--信号发送
- 父子进程间信号通信
- Linux 进程间通信 信号
- 嵌入式 进程间通信--信号
- 进程间通信______信号
- 对netflow v9 协议模板部分的翻译
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
- 英国留学就业需要具备的条件
- python-NO.1
- C#操作系统注册表using Microsoft.Win32;
- 进程间通信_04信号
- HTML5流量价值最大化-赵伊江
- 运动检测(前景检测)之(一)ViBe
- Javascript 异步加载详解(浏览器在javascript的加载方式)
- 黑马程序员_交通灯系统的设计、分析与实现
- Android序列号接口Parcelable
- Redis管理后台开发
- C++ 大根堆排序
- OC字符串常用函数