Linux 信号概要

    一、概要

      详细介绍:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html

       信号是UNIX和Linux系统响应结条件而产生的一个事件。接收到信号的进程会相应地采取一些行动。

    (1) 在系统终端下输入命名: kill -l 或 trap -l 可以查看系统所支持的信号!

    (2) 信号编号1-32 是早期的信号,是不可靠信号,信号在一定条件下会丢失;

    (3) 信号编号33以上是后期版系统本出现的,是可靠信号。信号生成时,进程响应还未结束,将自动排队等待响应。

    (4) 信号 9 SIGKILL   和 信号 19 SIGSTOP  这两个信号不可以被捕获或忽略。

 

 

    二、 函数介绍:

    头文件: signal.h

 

   1.  信号集处理:

       sigfillset(sigset_t *set); 设置所有的信号到set信号集中;

       sigemptyset(sigset_t *set); 从set信号集中清空所有信号;

      sigaddset(sigset_t *set,int sig);在set信号集中加入sig信号;

      sigdelset(sigset_t *set,int sig);在set信号集中删除sig信号;

 

   2. 信号处理函数

       (1)传统的信号处理接口: void (*signal(int sig, void (*func)(int )))(int),

        因为可靠信号的出现重新规范了健壮的信号接口:int sigaction(int sig,const struct sigaction  *act,struct sigaction *oldact);

        关于结构体 struct sigaction ,查询 man 手册;

        struct sigaction 成员:

         sa_hanlder 和 sa_sigaction  指向信号处理函数的指针,只能定义其中一个,两个都定义的话,将执行sa_handler指向的函数;其中可以指向宏定义 SIG_IGN(忽略信号) 和 SIG_DFL(信号默认行为);

 

       sa_mask 指定的是阻塞信号集,定义信号处理函数时,不被阻塞信号集中的信号打断。信号处理时如果信号未加入阻塞信号集中,将打断在执行的信号处理。

 

   3.发送信号函数

       (1) int raise(int sig);  对当前进程发送指定信号

       (2) int pause(void);  将进程挂起等待信号

       (3) int kill(pid_t pid,int sig); 通过进程编号发送信号

       (4) unsigned int alarm(unsigned int seconds); 指定时间(秒)发送SIGALRM信号。 seconds 为0 时取消所有已设置的alarm请求;

       (5)int sigqueue(pid_t pid,int sig,const union sigval val);类似于kill函数,多了附带共用体 union sigval形数,将共用体中的成员 int sival_int 或 void *sival_ptr 的值传递给 信号处理函数中的定义类型 siginfo_t 中的 int si_int 或 void *si_ptr;

       (6)int setitimer(int which,const struct itimerval *value,struct itimerval *oldvalue);  可定时发送信号,根据which可指定三种信号类型:SIGALRM、SIGVTALRM 和 SIGPROF;作用时间也因which值不同而不同;struct itimerval 的成员 it_interval定义间隔时间,it_value 为0时,使计时器失效;

        (7) void abort(void) 将造成进程终止;除非捕获SIGABORT信号;    

 

  4.阻塞信号

       int sigprocmask(int how,const sigset_t *set,sigset_t *set);  根据how值,设置阻塞信号集,或释放阻塞的信号集

       int sigpending(sigset_t *set); 获取在阻塞中的所有信号;

       int sigsuspend(const sigset_t *set);    类似于 pause()函数!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值