Head First C 学习日志 第十章 进程间通讯 捕捉信号

Head First C 第十章 进程间通讯 捕捉信号

关于信号

信号是操做系统控制程序的方式,举个栗子,操做系统在看到用户输入了Ctrl+C时,就会向程序发送中断信号。 信号映射表git

信号 处理函数
SIGURG 不作事情
SIGINT 调用exit()

捕捉信号而后运行本身的代码

有时候你但愿别人打断你的程序时运行本身的代码。假设进程打开了一些文件或网络链接,你但愿在退出以前把它们关闭,而且作一些清理工做。在这里引入sigaction结构。 sigaction是一个函数包装器 sigaction是一个结构体,它有一个函数指针,siagction告诉操做系统进程收到某个信号时该调用哪一个函数github

sigaction的建立方法以下
struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flag = 0;

sigemptyset用于设置信号,在信号被使用前必须调用sigemptysetsigfillsetsigemptyset在man中的函数原型和解释是:网络

int sigemptyset(sigset_t *set);

The sigemptyset() function initializes a signal set to be empty.函数

将信号初始化设置为空。 处理器必须接收信号参数 信号是一个整型值,若是你建立了一个自定义处理函数,就须要接收一个整型参数:操作系统

void diediedie(int sig) {
	  puts("Goodbye cruel world...\n");
	  exit(1);
	}
用sigaction()注册sigaction

建立sigaction之后,须要用sigaction()函数注册,使操做系统知道它的存在。指针

int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);

sigaction()函数接收3个参数,信号,动做,旧动做(能够传NULL)。rest

将建立和初始化封装成一个函数
int catch_signal(int sig, void (*handler)(int)) {
	struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flags = 0;
	return sigaction(sig, &action, NULL);
}

这样只要把信号和处理器传给catch_signal()函数,就能够设置信号处理器了。code

给进程发送信号

用kill命令发送信号

运行程序后,可使用Ctrl+C发送一个中断信号,若是想发送其余信号,能够用在终端下用kill命令,格式为kill -信号 进程号 kill -INT 1739的效果和Ctrl+C同样,都是发送中断信号。进程

在进程内发送信号

在进程内可使用raise()函数向本身发送信号。 一般会在自定义的信号处理器中使用raise(),这样程序就能在接收到低级别的信号时引起更高级别的信号,这叫作信号升级get

例程代码

signal handler sample

相关文章
相关标签/搜索