linux下C 信号集处理函数

sigset_t  为信号集 可 sizeof(sigset_t) 查看  128K


int sigemptyset(sigset_t * set)
清空设置




int sigfillset(sigset_t * set)
置满信号集




int sigaddset(sigset_t *set, int signo)
把信号集某个信号位置1




int sigdelset(sigset_t *set ,int signo)
把信号集某个信号位置0



int sigismember(count sigset_t *set,int signo)
判断信号集第几个信号是否1


读取或者更改进程的信号屏蔽字
int sigprocmask(int how,const sigset_t *set,sigset_t *oset);
成功返回0 失败返回-1
如果参数oldset不是NULL指针 ,那么目前的信号屏蔽字会由此指针返回。

1.SIG_BLOCK: 该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
2.SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。



int sigpending ( sigset_t *set)
获取当前进程的未决信号集



#include <signal.h>
信号捕捉 int sigaction(int signum, const struct sigaction *act, struct sigaction * oldact) ;
signum  第几号信号
act  要设置成什么动作
oldact 原有的动作 如果不关心 那么直接 NULL


struct sigaction 结构体  定义  
    struct sigaction {
        void  (*sa_handler)(int);
        void  (*sa_sigaction)(int, siginfo_t * , void *);
        sigset_t sa_mask;
        int   sa_flags;
        void (*sa_restorer)(void);
    };


C标准库信号处理函数
typedef  void (*sighandler_t)(int)
sighandler_t signal(int signum,sighandler_t handler)


系统调用函数   集合 fork  exec  wait 一体
int system(const char * command );
   用firefox 打开百度  system("firefox  www.baidu.com");


#include <unistd.h>
pause() 会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断.
使调用进程挂起。直到有信号抵达。如果抵达信号为忽略。则继续挂起



int  sigsuspend(const sigset_t *mask)
以通过制定mask来临时解除对某个信号的屏蔽 然后挂起等待  当sigsuspend返回恢复为原来值
1. 通过制定的mask来临时解除某个信号的屏蔽
2.挂起等待
3.当被信号唤醒 sigsuspend返回时 进程信号屏蔽字恢复为原来的值








DEMO
 把二号信号置成阻塞 10秒后解除
#include <signal.h>
#include<stdio.h>
#include <stdlib.h>
int printsigset(const sigset_t *set) {

    int i;
    for(i = 1;i<32;i++) {
        if(sigismember(set,i) == 1) {
            putchar('1');
        } else {
            putchar('0');
        }
    }
    puts("");
}


int main() {

    sigset_t s,p;

    //清空所有信号
    sigemptyset(&s);

    //把  SIGINT 设置成1
    sigaddset(&s,SIGINT);
    sigaddset(&s,SIGQUIT);
    //把传递进来的信号集 和原有的做个或操作  
    sigprocmask(SIG_BLOCK,&s,NULL);

    int i = 0;
    while(1) {

        sigpending(&p);
        printsigset(&p);
        if(i == 10) {
            sigdelset(&s,SIGQUIT);
            sigprocmask(SIG_UNBLOCK,&s,NULL);
        }
        sleep(1);
        i++;
    }

    return 0;
}





自定义信号处理函数
#include<stdio.h>
#include <signal.h>
void  do_sig(int num) {
    printf("i am do_sig\n");
    printf("num = %d\n",num);

}

int main(void) {
    struct sigaction act;

    act.sa_handler = do_sig;    // SIG_DFL  如果是这个 那么就是默认   SIG_IGN 忽略
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;

    sigaction(SIGINT,&act,NULL);

    while(1) {
        printf("*********************\n");
        sleep(1);
    }

    return 0;
}



pasue暂时中断进程直到系统调用 或者外部kill调用
void do_sig(int a) {
    printf("sss\n");
}
int main() {

        struct sigaction act;

        act.sa_handler = do_sig;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
        sigaction(SIGUSR1,&act,NULL);
        pause();

外部调用
kill -SIGUSR1 6708


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值