网站开发学徒工作如何如何在电脑上做物流网站
news/
2025/9/23 2:22:54/
文章来源:
网站开发学徒工作如何,如何在电脑上做物流网站,河北建设工程信息网首页,商城小程序开发哪家好转载#xff1a;http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp时发现之前对signal到理解实在浅显#xff0c;今天拿来单独学习讨论下。 signal#xff0c;此函数相对简单一些#xff0c;给定一个信号#xff0c;给出信号处理函数则可#xff…转载http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp时发现之前对signal到理解实在浅显今天拿来单独学习讨论下。 signal此函数相对简单一些给定一个信号给出信号处理函数则可当然函数简单其功能也相对简单许多简单给出个函数例子如下 [cpp] view plaincopy 1 #include signal.h 2 #include stdio.h 3 #include unistd.h 4 5 void ouch(int sig) 6 { 7 printf(I got signal %d\n, sig); 8 // (void) signal(SIGINT, SIG_DFL); 9 //(void) signal(SIGINT, ouch); 10 11 } 12 13 14 15 int main() 16 { 17 (void) signal(SIGINT, ouch); 18 19 while(1) 20 { 21 printf(hello world...\n); 22 sleep(1); 23 } 24 } 当然实际运用中需要对不同到signal设定不同的到信号处理函数SIG_IGN忽略/SIG_DFL默认这俩宏也可以作为信号处理函数。同时SIGSTOP/SIGKILL这俩信号无法捕获和忽略。注意经过实验发现signal函数也会堵塞当前正在处理的signal但是没有办法阻塞其它signal比如正在处理SIG_INT再来一个SIG_INT则会堵塞但是来SIG_QUIT则会被其中断如果SIG_QUIT有处理则需要等待SIG_QUIT处理完了SIG_INT才会接着刚才处理。sigaction这个相对麻烦一些函数原型如下 int sigaction(int sig, const struct sigaction *act, struct sigaction *oact) 函数到关键就在于struct sigaction [cpp] view plaincopy stuct sigaction { void (*)(int) sa_handle; sigset_t sa_mask; int sa_flags; } [cpp] view plaincopy 1 #include signal.h 2 #include stdio.h 3 #include unistd.h 4 5 6 void ouch(int sig) 7 { 8 printf(oh, got a signal %d\n, sig); 9 10 int i 0; 11 for (i 0; i 5; i) 12 { 13 printf(signal func %d\n, i); 14 sleep(1); 15 } 16 } 17 18 19 int main() 20 { 21 struct sigaction act; 22 act.sa_handler ouch; 23 sigemptyset(act.sa_mask); 24 sigaddset(act.sa_mask, SIGQUIT); 25 // act.sa_flags SA_RESETHAND; 26 // act.sa_flags SA_NODEFER; 27 act.sa_flags 0; 28 29 sigaction(SIGINT, act, 0); 30 31 32 struct sigaction act_2; 33 act_2.sa_handler ouch; 34 sigemptyset(act_2.sa_mask); 35 act.sa_flags 0; 36 sigaction(SIGQUIT, act_2, 0); 37 while(1) { sleep(1); } 38 return; } 1. 阻塞sigaction函数有阻塞的功能比如SIGINT信号来了进入信号处理函数默认情况下在信号处理函数未完成之前如果又来了一个SIGINT信号其将被阻塞只有信号处理函数处理完毕才会对后来的SIGINT再进行处理同时后续无论来多少个SIGINT仅处理一个SIGINTsigaction会对后续SIGINT进行排队合并处理。 2. sa_mask信号屏蔽集可以通过函数sigemptyset/sigaddset等来清空和增加需要屏蔽的信号上面代码中对信号SIGINT处理时如果来信号SIGQUIT其将被屏蔽但是如果在处理SIGQUIT来了SIGINT则首先处理SIGINT然后接着处理SIGQUIT。 3. sa_flags如果取值为0则表示默认行为。还可以取如下俩值但是我没觉得这俩值有啥用。 SA_NODEFER如果设置来该标志则不进行当前处理信号到阻塞 SA_RESETHAND如果设置来该标志则处理完当前信号后将信号处理函数设置为SIG_DFL行为 下面单独来讨论一下信号屏蔽记住是屏蔽不是消除就是来了信号如果当前是block则先不传递给当前进程但是一旦unblock则信号会重新到达。 [cpp] view plaincopy #include signal.h #include stdio.h #include unistd.h static void sig_quit(int); int main (void) { sigset_t new, old, pend; signal(SIGQUIT, sig_quit); sigemptyset(new); sigaddset(new, SIGQUIT); sigprocmask(SIG_BLOCK, new, old); sleep(5); printf(SIGQUIT unblocked\n); sigprocmask(SIG_SETMASK, old, NULL); sleep(50); return 1; } static void sig_quit(int signo) { printf(catch SIGQUIT\n); signal(SIGQUIT, SIG_DFL); } gcc -g -o mask mask.c ./mask 这个地方按多次ctrl\ SIGQUIT unblocked catch SIGQUIT Quit (core dumped) 注意观察运行结果在sleep的时候按多次ctrl\由于sleep之前block了SIG_QUIT所以无法获得SIG_QUIT但是一旦运行sigprocmask(SIG_SETMASK, old, NULL);则unblock了SIG_QUIT则之前发送的SIG_QUIT随之而来。 由于信号处理函数中设置了DFL所以再发送SIG_QUIT则直接coredump。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911106.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!