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