Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891368
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: LINUX

2009-04-14 14:09:06

Linux的信号处理是一种相对落后却必不可少的消息处理机制.
主要是因为,kill与stop两个信号.因为所有的系统管理员都有可能使用它们来管理系统.
不过由于信号这一机制用了很长时间,还是很值得我们花一些力气去研究一下的.
信号的处理倒是很简单,首先要定义一个信号处理函数.
void signal_handler(int signo);
其次,就是调用signal函数,把处理函数与信号的关系关联上.
if(signal(SIGINT,signal_handler) == SIG_ERR){
//关联失败处理 
}
需要知道的是,信号处理函数是会随时中断当前程序的处理流程的.在信号处理函数调用完成后,会返回到原来的中断的处理流程处,继续原来的流程.这样就要求信号处理函数,最好是可重入的(不仅自己写的代码要可重入,对应的调用函数也要是可重入的才成).
信号处理是不可以继承的,也就是父进程对信号的处理是不会自动应用到子进程上的.
信号对应的字符串是可以通过函数得到的,不用我们进行硬编码.
下面是Linux用的函数.
#define _GNU_SOURCE
#include
char *strsignal(int signo);

要向一个进程发信号就要用下面的几个函数了.
#include
#include
int kill(pid_t pid, int signo);

发给自己用下面这个
int raise(int signo);

发给一个进程组用下面这个.
int killpg(int pgrp, int signo);

可能再有用一些的就是用signal发送一些简单的信息了.
int sigqueue(pid_t pid, int signo, const union sigval value);
union sigval {
int sival_int;
void *sival_ptr;
}
阅读(470) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~