刚接触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(&action1.sa_mask);
- action1.sa_handler = my_func;
- action1.sa_flags = 0;
- sigaction(SIGINT, &action1, 0);
- }
-
- if (sigismember(&set, SIGQUIT)) {
- sigemptyset(&action2.sa_mask);
- action2.sa_handler = SIG_DFL;
- action2.sa_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);
- }