进程间通讯之信号

信号是软件中断。很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步事件的方法。每个信号都有一个名字,并且他们的名字都是以SIG开头的。

信号的处理或相关动作有三种处理方式:

  1、默认信号(SIG_DFL)

2、忽略信号(SIG_IGN):大多数信号可采用,除SIGKILL和SIGSTOP外。

3、自定义信号(function):自定义信号是将原来的信号被用户通过一个自定义函数修改为用户想要执行某种功能的信号。

 

信号的使用一般通过一个signal函数来实现。它的原型为:

void (*signal(int signo, void (*func)(int)))(int);

若调用成功则返回信号以前的处理配置,若出错则返回SIG_ERR。

第一个参数为一个整数(因为信号都通过宏定义为一个整数,所以信号就是一个整数)。第二个参数为函数指针,指向一个无返回值且只有一个整形参数的函数首地址(该函数的功能主要是修改信号为用户想要实现的信号或功能,整形参数就是要被修改的信号)。下面就是实现一个信号的具体使用方法:

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<string.h>

#include<assert.h>

#include<fcntl.h>

#include<sys/types.h>

#include<signal.h>

int count = 0;

void fun(int sign)

{

count++;

if(3 == count)

{

//exit(0);

signal(SIGINT,SIG_DFL);

}

printf("hello world!\n");

}

void main()

{

signal(SIGINT,fun);

int i = 0;

for(; i < 10; i++)

{

sleep(1);

}

}

 

此段代码的功能为前三次按Ctrl+c每次都会打印一个“hello world!”,第四次再按则进程就结束了(Ctrl+c 为终止信号相当于SIGINT)。起实质就是将终止信号改变为一个打印功能,当满足一定条件后再将其改回来终止进程。

 

信号有很多,我们接触到的大约就以下信号:

SIGHUP     终止进程     终端线路挂断
SIGINT     终止进程     中断进程
SIGQUIT   建立CORE文件终止进程,并且生成core文件
SIGILL   建立CORE文件       非法指令
SIGTRAP   建立CORE文件       跟踪自陷
SIGBUS   建立CORE文件       总线错误
SIGSEGV   建立CORE文件       段非法错误
SIGFPE   建立CORE文件       浮点异常
SIGIOT   建立CORE文件       执行I/O自陷
SIGKILL   终止进程     杀死进程
SIGPIPE   终止进程     向一个没有读进程的管道写数据
SIGALARM   终止进程     计时器到时
SIGTERM   终止进程     软件终止信号
SIGSTOP   停止进程     非终端来的停止信号
SIGTSTP   停止进程     终端来的停止信号
SIGCONT   忽略信号     继续执行一个停止的进程
SIGURG   忽略信号     I/O紧急信号
SIGIO     忽略信号     描述符上可以进行I/O
SIGCHLD   忽略信号     当子进程停止或退出时通知父进程
SIGTTOU   停止进程     后台进程写终端
SIGTTIN   停止进程     后台进程读终端
SIGXGPU   终止进程     CPU时限超时
SIGXFSZ   终止进程     文件长度过长
SIGWINCH   忽略信号     窗口大小发生变化
SIGPROF   终止进程     统计分布图用计时器到时
SIGUSR1   终止进程     用户定义信号1
SIGUSR2   终止进程     用户定义信号2
SIGVTALRM 终止进程     虚拟计时器到时

猜你喜欢

转载自blog.csdn.net/magic_world_wow/article/details/79826640