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 "); 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
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。