linux 信号

信号(Signal,亦称作软中断)机制是在软件层次上对中断机制的一种模拟。

一个完整的信号生命周期可以分为 3 个重要阶段,这 3 个阶段由 4 个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。
#include <signal.h>

int sigemptyset(sigset_t *set);  
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号。函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示该信号集的有效信号包括系统支持的所有信号。注意,在使用sigset_t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。这四个函数都是成功返回0,出错返回-1。sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1。

总结:
信号的初始化分以下几步:
1.sigemptyset(sigset_t *set);
2. sigaddset(sigset_t *set, int signo);
3.初始化sigaction 结构体
struct sigaction 
{
   void   (*sa_handler)(int);   /* addr of signal handler,or SIG_IGN, or SIG_DFL */
   sigset_t sa_mask;               /* additional signals to block */
   int       sa_flags;              /* signal options, Figure 10.16 */
   void     (*sa_sigaction)(int, siginfo_t *, void *);/* alternate handler */
};
如 struct sigaction act;
act.sa_handlder= somefunc_pointer;
act.sa_mask=(sigset_t) mask;
act.sa_flag= 0;
4.调用sigaciton() 函数(用来捕捉信号)

sigaction(int signum,struct sigaction *act,struct sigaction *oact);这个系统调用用act来定义信号signum的处理程序.如果oact不是NULL,它用来描述在调用sigaciton()之前信号的状态.如果act是NULL,保持现在的信号状态不变,是程序在不修改信号的前提下可以获得该信号现在的状态.sigaction()成功返回0,出错返回非0值.只有当sigaction的一个或者多个参数非法时候才会出现错误.


#include <unistd.h>
#include <signal.h>
#include <stdio.h>

void sig_alrm(int signo)
{
    /* nothing to do */
}

unsigned int mysleep(unsigned int nsecs)
{
    struct sigaction newact, oldact;
    unsigned int unslept;

     newact.sa_handler = sig_alrm;
     sigemptyset(&newact.sa_mask);
     newact.sa_flags = 0;
     sigaction(SIGALRM, &newact, &oldact);

     alarm(nsecs);
     pause();

     unslept = alarm(0);
     sigaction(SIGALRM, &oldact, NULL);

    return unslept;
}

int main(void)
{
    while(1){
         mysleep(2);
         printf("Two seconds passed\n");
     }
    return 0;
}

/*程序2*/

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>

void my_fun(int sig_no)
{
if(sig_no==SIGINT)
   printf("I have get SIGINT\n");
else if(sig_no==SIGQUIT)
   printf("I have get SIGQUIT\n");
}
int main(void)
{
printf("Waiting for signal SIGINT or SIGQUIT.....\n");
signal(SIGINT,my_fun);
signal(SIGQUIT,my_fun);
pause();
exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值