天津做个网站需要多少钱,外包网站开发价格,什么网站可以在图片上做超链接,企业信用信息查询系统实际应用中#xff0c;进程可能需要等待某一事件的发生#xff0c;一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。
第一种#xff1a;程序不停循环检测全局变量#xff0c;这样可以满足要求#xff0c;但是非常占用cpu资源
#include进程可能需要等待某一事件的发生一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。
第一种程序不停循环检测全局变量这样可以满足要求但是非常占用cpu资源
#includestdio.h
#includestring.h
#includestdlib.h
#includesignal.h
#includeunistd.h
#define UNHAPPEN 0
#define HAPPENED 1
int flag_happen;
void handler_sigint(int signo){flag_happenHAPPENED;
}
int main(int argc,char **argv){if(signal(SIGINT,handler_sigint)SIG_ERR){perror(signal);exit(1);}while (1){if(flag_happenHAPPENED){printf(event happened\n);break;}}}
第二种用pause挂起等待信号的触发事件发生时向进程发送信号对应的信号处理函数改变全局变量的值信号处理函数返回后进程检测该全局变量满足要求即可直到事件已发生
#includestdio.h
#includestring.h
#includestdlib.h
#includesignal.h
#includeunistd.h
#define UNHAPPEN 0
#define HAPPENED 1
int flag_happen;
void handler_sigint(int signo){flag_happenHAPPENED;
}
int main(int argc,char **argv){if(signal(SIGINT,handler_sigint)SIG_ERR){perror(signal);exit(1);}while (flag_happenUNHAPPEN){pause();}printf(after event happened\n);}
第三种原理和第二种一致不过使用的函数是sigsuspend
#includestdio.h
#includestring.h
#includestdlib.h
#includesignal.h
#includeunistd.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_happenHAPPENED;
}
int main(int argc,char **argv){sigset_t newmask,oldmask,zeromask;if(signal(SIGINT,handler_sigint)SIG_ERR){my_err(signal,__LINE__);}sigemptyset(newmask);sigemptyset(zeromask);sigaddset(newmask,SIGINT);//屏蔽信号SIGINTif(sigprocmask(SIG_BLOCK,newmask,oldmask)0)my_err(sigprocmask,__LINE__);else printf(SIGINT blocked\n);while (flag_happenUNHAPPEN){sigsuspend(zeromask);}printf(after event happened\n);//将信号屏蔽字恢复if(sigprocmask(SIG_SETMASK,oldmask,nullptr)0)my_err(sigprocmask,__LINE__);return 0;}
上述每个函数的用法在前面文章都讲过不懂的往前看谢谢喵