linux信号函数总结

来源:互联网 发布:unity3d 多线程渲染 编辑:程序博客网 时间:2024/06/15 01:46

信号相关的事件和状态

产生信号:

1. 按键产生,如:Ctrl+c、Ctrl+z、Ctrl+\

2. 系统调用产生,如:kill、raise、abort

3. 软件条件产生,如:定时器alarm

4. 硬件异常产生,如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)

5. 命令产生,如:kill命令

         递达:递送并且到达进程。

         未决:产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态。

         信号的处理方式:

1. 执行默认动作

2. 忽略(丢弃)

3. 捕捉(调用户处理函数)


typedef void(*sighandler_t)(int);

sighandler_t  signal(int signum, sighandler_t handler);

功能:注册一个信号捕捉函数

参数:

signum,信号值,尽量用宏。handler:信号注册函数


int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 

功能:修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数),可以给用信号捕捉函数传参数

 成功:0;失败:-1,设置errno

参数:

act:传入参数,新的处理方式。

                 oldact:传出参数,旧的处理方式。  

struct sigaction结构体

    structsigaction {

       void     (*sa_handler)(int);

       void     (*sa_sigaction)(int,siginfo_t *, void *);

       sigset_t  sa_mask;

       int       sa_flags;

       void     (*sa_restorer)(void);

    };

 sa_restorer:   该元素是过时的,不应该使用,

         sa_sigaction:当sa_flags被指定为SA_SIGINFO标志时,使用该信号处理程序。(很少使用) 

主要参数:

         ① sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略或 SIG_DFL表执行默认动作

         ② sa_mask: 调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。

         ③ sa_flags:通常设置为0,表使用默认属性

intkill(pid_t pid, int sig); 

功能:给指定进程发送信号 

成功:0;失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno

         sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致

pid > 0:  发送信号给指定的进程。

         pid = 0:  发送信号给 与调用kill函数进程属于同一进程组的所有进程。

         pid < 0:  取|pid|发给对应进程组

         pid = -1:发送给进程有权限发送的系统中所有进程、

注意:

权限保护:super用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root用户的pid)  是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。只能向自己创建的进程发送信号。普通用户基本规则是:发送者实际或有效用户ID == 接收者实际或有效用户ID

int  sigqueue(pid_t pid, int sig, const union sigval value);

功能:给指定进程发送信号,发送信号时可以传参数

成功:0;失败:-1,设置errno

          union sigval {

               int   sival_int;

               void *sival_ptr;

          };



原创粉丝点击