等待信号发生
等待信号发生, 后进行相关处理
例1: sigsuspend等待信号发生
wait_sigsuspend.c
// 示例使用sigsuspend函数挂起等待事件的发生 #include <stdio.h> #include <signal.h> #define UNHAPPEN 0 // 未发生 #define HAPPENED 1 // 已发生 /*定义全局变量以标识事件是否发生*/ int flag_happen; /*自定义的错误处理函数*/ void my_err(const char * err_string, int line) { fprintf(stderr, "line:%d ", line); perror(err_string); exit(1); } void handler_sigint(int signo) { flag_happen = HAPPENED; } int main() { sigset_t newmask, oldmask, zeromask;
printf("pid is: %d\n", getpid()); /*安装信号处理函数*/ if (signal(SIGINT, handler_sigint) == SIG_ERR) { my_err("signal", __LINE__); } sigemptyset(&newmask); sigemptyset(&zeromask); sigaddset(&newmask, SIGINT); /*屏蔽信号SIGINT*/ if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) { my_err("sigprocmask", __LINE__); } else { printf("SIGINT blocked\n"); } while (flag_happen == UNHAPPEN) sigsuspend(&zeromask); printf("after event happened\n"); /*... do something else...*/ /*将信号屏蔽字恢复*/ if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) { my_err("sigprocmask", __LINE__); } return 0; }
编译链接执行, 按"ctrl+c"键后, 输出结果如下:
或者执行后, 在另一终端用kill命令发信号, 输出结果如下:
另一终端执行的命令
例2: 循环等待, 直到等到信号
wait_cycle.c
#include <stdio.h> #include <signal.h> #define UNHAPPEN 0 // 未发生 #define HAPPENED 1 // 已发生 /*定义全局变量以标识事件是否发生*/ int flag_happen; void handler_sigint(int signo) { flag_happen = HAPPENED; } int main() { /*安装信号处理函数*/ if (signal(SIGINT, handler_sigint) == SIG_ERR) { perror("signal"); exit(1); } while (1) { if (flag_happen == HAPPENED) { printf("event happened\n"); /*... you can do something here...*/ break; } } return 0; }
例3: pause()等待信号发生
wait_pause.c
#include <stdio.h> #include <signal.h> #include <unistd.h> #define UNHAPPEN 0 // 未发生 #define HAPPENED 1 // 已发生 /*定义全局变量以标识事件是否发生*/ int flag_happen; void handler_sigint(int signo) { flag_happen = HAPPENED; } int main() {
printf("pid is: %d\n", getpid()); /*安装信号处理函数*/ if (signal(SIGINT, handler_sigint) == SIG_ERR) { perror("signal"); exit(1); } while (flag_happen == UNHAPPEN) pause(); printf("after event happened\n"); /*... you can do something else here ...*/ return 0; }
编译链接执行, 输出结果如下: 其中3次./wait_pause命令执行的输出分别是按"ctrl+c", 及在另一终端执行kill命令时的输出结果.
下面是输出结果时对应的另一终端命令: