| 
		    
                    
   三、进程对信号的响应 
  进程可以通过三种方式来响应一个信号:(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); 
		    
                       
		      
		      
		   |