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);
}