您的位置:首页 > 其它

等待信号发生

2016-01-07 20:25 211 查看
等待信号发生, 后进行相关处理

例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命令时的输出结果.



下面是输出结果时对应的另一终端命令:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: