进程通信(五)-信号

信号(signal)机制是 UNIX 系统中最古老的进程之间的通信机制,用于在多个进程之间传递异步信号。信号可以由各种异步时间产生,例如键盘中断等。

Linux 系统中定义了一系列的信号,这些信号可由内核产生,也可以由系统中的其他进程产生。命令 “kill -l” 可列出所有信号。

  1. 进程可以屏蔽大多数的信号,除了SIGSTOP 和SIGKILL
    • SIGSTOP 信号使一个正在运行的进程暂停,
    • SIGKILL 信号使正在运行的进程退出
  2. 进程可选择系统的默认方式处理信号,也可以选择自己的方式处理产生的信号。
  3. 信号之间不存在相对的优先权
  4. 系统无法处理同时产生的多个同种信号,也就是说,进程不能分辨它收到的是1个或是42个SIGCONT信号
#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;
}
View Code

kill(pid,sig) 函数向进程号为pid的进程发送信号,信号值为sig. 当pid=0时,向当前系统的所有进程发送信号0,即群发。

raise()函数在当前进程中自举一个信号sig, 即向当前进程发送信号。

#include <iostream>
#include <sys/types.h>
#include <signal.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  kill(n,2);
  return 0;
}
View Code

 

参考(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: 这是一个用户定义的信号,可用于应用程序

posted on 2020-03-01 11:02  猪伯  阅读(266)  评论(0编辑  收藏  举报

导航