进程通信(五)-信号
信号(signal)机制是 UNIX 系统中最古老的进程之间的通信机制,用于在多个进程之间传递异步信号。信号可以由各种异步时间产生,例如键盘中断等。
Linux 系统中定义了一系列的信号,这些信号可由内核产生,也可以由系统中的其他进程产生。命令 “kill -l” 可列出所有信号。
- 进程可以屏蔽大多数的信号,除了SIGSTOP 和SIGKILL
- SIGSTOP 信号使一个正在运行的进程暂停,
- SIGKILL 信号使正在运行的进程退出
- 进程可选择系统的默认方式处理信号,也可以选择自己的方式处理产生的信号。
- 信号之间不存在相对的优先权
- 系统无法处理同时产生的多个同种信号,也就是说,进程不能分辨它收到的是1个或是42个SIGCONT信号
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <signal.h> #include <stdio.h> #include <unistd.h> using namespace std; typedef void (*sighandler_t) (int); static void sig_handler(int signo){ if(SIGSTOP==signo) cout<<"接收到信号SIGSTOP"<<endl; else if(SIGKILL==signo) cout<<"接收到信号SIGKILL"<<endl; else cout<<"接收到信号"<<signo<<endl; } int main(){ sighandler_t ret; cout<<"pid: "<<getpid()<<endl; ret = signal(SIGSTOP,sig_handler); if(SIG_ERR==ret) cout<<"为SIGSTOP挂接信号处理函数失败"<<endl; ret = signal(SIGKILL,sig_handler); if(SIG_ERR==ret) cout<<"为SIGKILL挂接信号处理函数失败"<<endl; ret = signal(SIGINT,sig_handler); if(SIG_ERR==ret) cout<<"为SIGINT挂接信号处理函数失败"<<endl; raise(2); raise(2); while(1); //等待 return 0; }
kill(pid,sig) 函数向进程号为pid的进程发送信号,信号值为sig. 当pid=0时,向当前系统的所有进程发送信号0,即群发。
raise()函数在当前进程中自举一个信号sig, 即向当前进程发送信号。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <sys/types.h> #include <signal.h> using namespace std; int main(){ int n; cin>>n; kill(n,2); return 0; }
参考(Rreference)
[1] Linux 网络编程
附录
SIGABRT: 调用 abort() 函数时 产生此信号,进场异常终止
SIGALRM: 超过用 alarm() 函数设置的时间时 产生此信号
SIGBUS: 指示一个实现定义的硬件故障
SIGCHILD: 在一个进程终止或停止时,SIGCHILD 信号被送给其父进程. 如果希望从父进程中了解其子进程的状态改变,则应捕捉此信号。信号捕捉函数中通常要调用 wait() 函数以取得子进程ID和其终止状态
SIGCONT: 此作业控制信号送给需要继续运行的处于停止状态的进程。如果接受到此信号的进程处于停止状态,则操作系统的默认动作是使该停止的进程继续运行,否则默认动作是忽略此信号。
SIGEMT: 指示一个实现定义的硬件故障
SIGFPE:此信号表示一个算数运算异常,例如除0,浮点数溢出等
SIGHUP: 如果终端界面检测到一个链接断开,则将此信号送给与该终端相关的进程
SIGILL:此信号指示进程已执行一条非法硬件指令
SIGINT:当用户按中断键(Delete 或 Ctrl+C)时,终端驱动程序产生这个信号并将信号送向前台进程组中的每个进程。
SIGIO:此信号指示一个异步IO事件
SIGIOT:这指示一个实现定义的硬件故障
SIGPIPE: 如果在读进程时已终止写管道,则产生此信号
SIGQUITE:当用户在终端上按退出键(一般采用Ctrl+C)时,产生此信号,并送至前台进程组中的所有进程
SIGSEGV:指示进程进行了一次无效的存储访问
SIGSTOP:这是一个作业控制信号,它停止一个进程
SIGSYS:指示了一个无效的系统调用。由于某种未知原因,某个进程执行了一条系统调用命令,但是跳用命令所用的参数无效
SIGTERM:这是由kill命令发送的系统默认终止信号
SIGTRAP: 指示一个实现定义的硬件故障
SIGTSTP: 交互停止信号,当用户在终端上按挂起键(Ctrl+Z)时,终端驱动程序产生此信号
SIGTTIN: 当一个后台进程组进程试图读其控制终端时,终端驱动程序产生此信号
SIGTTOUT: 当一个后台进程组进程试图写其控制终端时,产生此信号
SIGURG:此信号通知进程已发生一个紧急情况。在网络连接上,接到非规定波特率的数据时,此信号可选择地产生
SIGUSR1: 这是一个用户定义的信号,可用于应用程序
SIGUSR2: 这是一个用户定义的信号,可用于应用程序