进程间软中断通信(signal函数和kill函数)

来源:互联网 发布:网络 问号 编辑:程序博客网 时间:2024/04/30 15:58
Linuxsignal函数是比较复杂的一个,其定义原型如下:
void (*signal(int signo,void (*func)(int))) (int)
这个函数中,最外层的函数体
void (* XXX )(int)
表明是一个指针,指向一个函数XXX的指针,XXX所代表的函数需要一个int型的参数,返回void
signal(int signo, void(*func)(int))
signal函数的主体.
需要两个参数int型的signo以及一个指向函数的函数.
void (*func)(int).
正是由于其复杂性,[Plauger 1992]typedef来对其进行简化
typedef void Sigfuc(int);//
这里可以看成一个返回值 .
再对signal函数进行简化就是这样的了
Sigfunc *signal(int,Sigfuc *);
我们在使用时signal,第一个参数代表信号,第二个参数代表接收到这个参数时所进行的操作。

kill
函数的定义和原型如下:
int kill(pid_t pid, int sig);
使用时要引入如下的两个头文件:
#include <sys/types.h>
#include <signal.h>
参数说明:
pid
:可能选择有以下四种:
1. pid
大于零时,pid是信号欲送往的进程的标识。
2. pid
等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid
等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)
4. pid
小于-1时,信号将送往以-pid为组标识的进程。
sig
:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。

返回说明:
成功执行时,返回0。失败返回-1errno被设为以下的某个值
EINVAL
:指定的信号码无效
EPERM
;没有给任何目标进程发送信号的权限
ESRCH
:目标进程或进程组不存在


#define SIGHUP   1
进程由於控制终端死去或者控制终端发出起命令
#define SIGINT   2
键盘中断所产生的信号

#define SIGQUIT   3
键盘终止

#define SIGILL   4
非法的指令

#define SIGTRAP   5
进程遇到一个追踪(trace)或者是一个中断嵌套

#define SIGABRT   6
abort系统调用所产生的中断信号

#define SIGIOT   6
类似於SIGABRT

#define SIGBUS   7
进程试图使用不合理的记忆体

#define SIGFPE   8
浮点异常

#define SIGKILL   9
KILL

#define SIGUSR1  10
用户自定义

#define SIGSEGV  11
段错误

#define SIGUSR2  12
用户自定义

#define SIGPIPE  13
管道操作时没有读只写

#define SIGALRM  14
alarm系统调用产生的timer时钟信号

#define SIGTERM  15
收到终端信号的进程

#define SIGSTKFLT 16
堆叠错误

#define SIGCHLD  17
子进程向父进程发出的子进程已经stop或者终止的信号

#define SIGCONT  18
继续运行的信号

#define SIGSTOP  19
stop

#define SIGTSTP  20
键盘所产生的stop信号

#define SIGTTIN  21
当运行在後状态时却需要读取stdin的资料

#define SIGTTOU  22
当运行在後状态时却需要写向stdout

#define SIGURG  23
socket
的紧急情况

#define SIGXCPU  24
进程超额使用CPU分配的时间

#define SIGXFSZ  25
进程使用了超出系统规定文件长度的文件

#define SIGVTALRM 26
内部的alarm时钟过期

#define SIGPROF  27
在一个程式段中描绘时钟集过期

#define SIGWINCH 28
终端视窗的改变

#define SIGIO  29
非同步IO

#define SIGPOLL  SIGIO
pollable
事件发生


如何去册一个信号handler?

  首先,sigprocmask设置或者更改信号mask,如果信号mask没有被设置,所有的信号采用预设的
方式处理,一旦设置了mask,就使用sigaction俘获信号

int sigprocmask(int how,const sigset_t,sigset_t *oldset);
how
有以下值:
SIG_BLOCK 
集合中包含额外的信号需要阻塞
SIG_UNBLOCK 
集合中包含额外的信号需要不阻塞
SIG_SETMASK 
集合中包含新的信号mask

struct sigaction{
 void (*sa_handler)(int);
 sigset_t sa_mask;
 int sa_flags;
 void (*sa_restorer)(void);
};

*sa_handler
指向信号处理的函数,sa_handler的参数可以是SIG_DFL,

,
启动信号处理的预设值,如果是SIG_IN,将忽略信号.

信号处理的过程中,需要使用sa_mask定义一套需要遮罩的信号

sa_flags
是改变sa_handler行为的mask,它可以是以下几种:

(1)SA_NOCLDSTOP
忽略子进程发出的SIGSTOP,SIGTSTP,SIGTTIN,SIGTTAU

(2)SA_ONESHOT
或者SA_RESETHAND
册的定制的信号处理仅仅被执行一次,在它被执行後,信号的缺省操作将被还原

(3)SA_RESTART
使能可重起的系统调用

(4)SA_NOMASK
或者SA_NODEFER

dont prevent the signal from being recieved within its own handler
忽略sa_restorer,它无需使用

原创粉丝点击