网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
天线制作 GPS 地标
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | Open source | GNU | Linux | BSD | Solaris | AIX | HP-UX | IRIX | Mac OS X | Minix | Tru64 | SCO UNIX | Network | Security | X-Window | Database | 应用服务 | Programming | 经典著作 | 永远的纪念 | 杂项
 当前位置: Home > Linux > 程序设计 > 进程间通讯 > 文章  
Linux环境进程间通信(二): 信号(上)
文章来源: IBM Developerworks 文章作者: 郑彦兴 发布时间: 2003-01-01   字体: [ ]  
 

  三、进程对信号的响应

  进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考[2]以及其它资料。注意,进程对实时信号的缺省反应是进程终止。

  Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

  四、信号的发送

  发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

  1、kill()

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int signo);

参数pid的值
信号的接收进程
pid>0
进程ID为pid的进程
pid=0
同一个进程组的进程
pid<0 pid!=-1
进程组ID为 -pid的所有进程
pid=-1
除发送进程自身外,所有进程ID大于1的进程

  Sinno 是信号值,当为0时(即空信号),实际不发送任何信号,但照常进行错误检查,因此,可用于检查目标进程是否存在,以及当前进程是否具有向目标发送信号的权限(root权限的进程可以向任何进程发送信号,非root权限的进程只能向属于同一个session或者同一个用户的进程发送信号)。

  Kill()最常用于pid>0时的信号发送,调用成功返回 0; 否则,返回 -1。注:对于pid<0时的情况,对于哪些进程将接受信号,各种版本说法不一,其实很简单,参阅内核源码kernal/signal.c即可,上表中的规则是参考red hat 7.2。

  2、raise()

#include <signal.h>
int raise(int signo);

  向进程本身发送信号,参数为即将发送的信号值。调用成功返回 0;否则,返回 -1。

  3、sigqueue()

#include <sys/types.h>
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval val);

  调用成功返回 0;否则,返回 -1。

  sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用。

  sigqueue的第一个参数是指定接收信号的进程ID,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。

typedef union sigval
{
  int  sival_int;
  void *sival_ptr;
} sigval_t;

  sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号,而不能发送信号给一个进程组。如果signo=0,将会执行错误检查,但实际上不发送任何信号, 0值信号可用于检查pid的有效性以及当前进程是否有权限向目标进程发送信号。

  在调用sigqueue时, sigval_t指定的信息会拷贝到3参数信号处理函数(3参数信号处理函数指的是信号处理函数由sigaction安装,并设定了 sa_sigaction指针,稍后将阐述)的siginfo_t结构中,这样信号处理函数就可以处理这些信息了。由于sigqueue系统调用支持发送带参数信号,所以比kill()系统调用的功能要灵活和强大得多。

  注:sigqueue()发送非实时信号时,第三个参数包含的信息仍然能够传递给信号处理函数; sigqueue()发送非实时信号时,仍然不支持排队,即在信号处理函数执行过程中到来的所有相同信号,都被合并为一个信号。

  4、alarm()

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

 
推荐文章
·深刻理解Linux进程间通信(IPC)
·Linux环境进程间通信: 管道及有
 

 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
相关分类
热点文章
·Linux环境进程间通信:
·深刻理解Linux进程间通
相关文章
·深刻理解Linux进程间通
·Linux环境进程间通信:
更多...
 
 

Copyright(c) 2001-2009 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统