linux c编程信号处理的一些实例signal sigaction

linux c编程信号处理的一些实例signal sigaction

刚接触linux下的c编程,记录一下吧.对于信号,就是我们经常用的那个kill,kill可以发送很多信号,当然,我们也可以通过程序来实现,我们甚至可以来定义对于不同的信号的处理,比如ctrl+c可能并不能退出我们的程序,因为我们可以监视ctrl+c发送的SIGINT信号,并且用我们自己的功能来进行处理.PS:发现写代码也是个需要手感的事儿,意识到该多看看vim的配置鸟~~~自动不全一定要强大才行哇~~~

先把课本上的两个小实例放上来,记录下:

1.signal()的使用

捕捉ctrl+c发送的SIGINT与ctrl+\发送的SIGQUIT信号

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
 
void my_func(int sign_no) { 
    if (sign_no == SIGINT) { 
        printf("I have get SIGINT\n"); 
    } else if (sign_no == SIGQUIT) { 
        printf("I have get SIGQUIT\n"); 
    } 
} 
 
int main() { 
    printf("waiting for signal SIGINT or SIGQUIT ... \n"); 
    signal(SIGINT, my_func); 
    signal(SIGQUIT, my_func); 
    pause(); 
    exit(0); 
} 

2.sigaction()的使用<—感觉是signal的一个变种

同样是捕捉ctrl+c发送的SIGINT与ctrl+\发送的SIGQUIT信号

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
 
void my_func(int sign_no) { 
    if (sign_no == SIGINT) { 
        printf("I have get SIGINT\n"); 
    } else if (sign_no == SIGQUIT) { 
        printf("I have get SIGQUIT\n"); 
    } 
} 
 
int main() { 
    struct sigaction action; 
    printf("waiting for signal SIGINT or SIGQUIT ... \n"); 
    action.sa_handler = my_func; 
    sigemptyset(&action.sa_mask); 
    action.sa_flags = 0; 
    sigaction(SIGINT, &action, 0); 
    sigaction(SIGQUIT, &action, 0); 
    pause(); 
    exit(0); 
} 


 

3.信号集

默认对信号进行状态阻塞,此时输入任何信号都不执行,ctrl+c 与ctrl+\都不会被执行,但是当输入任意字符并回车后,原来的信号就会被立即执行.可以先输入任意字符解除SIG_BLOCK状态,然后执行SIG_INT与SIG_QUIT,SIG_INT调用我们自己的函数my_func,所以程序会一直不退出,但是SIG_QUIT仍旧是系统的函数,因此可以正常表达

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
 
void my_func(int signum) { 
    printf("If you want to quit ,please try SIGQUIT\n"); 
} 
 
int main() { 
    sigset_t set, pendset; 
    struct sigaction action1, action2; 
 
    if (sigemptyset(&set) < 0) { 
        perror("sigemptyset"); 
        exit(1); 
    } 
 
    if (sigaddset(&set, SIGQUIT) < 0) { 
        perror("sigaddset"); 
        exit(1); 
    } 
 
    if (sigaddset(&set, SIGINT) < 0) { 
        perror("sigaddset"); 
        exit(1); 
    } 
 
    if (sigismember(&set, SIGINT)) { 
        sigemptyset(&actionsa_mask); 
        actionsa_handler = my_func; 
        actionsa_flags = 0; 
        sigaction(SIGINT, &action1, 0); 
    } 
 
    if (sigismember(&set, SIGQUIT)) { 
        sigemptyset(&actionsa_mask); 
        actionsa_handler = SIG_DFL; 
        actionsa_flags = 0; 
        sigaction(SIGQUIT, &action2, 0); 
    } 
 
    if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) { 
        perror("sigprocmask"); 
        exit(1); 
    } else { 
        printf("Signal set was blocked,Press any key!"); 
        getchar(); 
    } 
    if (sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) { 
        perror("sigprocmask"); 
        exit(1); 
    } else { 
        printf("Signal set is unblock state\n"); 
    } 
    while (1) 
        ; 
    exit(0); 
} 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值