入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

linux下C 信号集处理函数

创建时间:2016-01-19 投稿人: 浏览次数:817
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 ");     printf("num = %d ",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("********************* ");         sleep(1);     }
    return 0; }


pasue暂时中断进程直到系统调用 或者外部kill调用 void do_sig(int a) {     printf("sss "); } 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

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。