Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1130151
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: LINUX

2016-01-04 18:13:01

转载下,有用的时候方便找.

点击(此处)折叠或打开

  1. 曾做过signal相关的一点儿开发,谈谈我的一些理解。
  2. 首先,需要理解几个signal相关的函数。
  3. sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sigNum 添加到信号集 sigSet 中;
  4. sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
  5. sigemptyset(sigset_t* sigSet) : 清空信号集;
  6. sigfillset(sigset_t* sigSet) : 在信号集中打开所有的信号。
  7. 但是这个时候只是定义好了如此一个信号集,还有对信号的操作函数:
  8. pthread_sigmask(int opCode, sigset_t* sigSet, sigset_t* oldSigSet) : opCode 指定了如何对 sigSet 里的信号进行处理。opCode 有三个值: SIG_BLOCK (将sigSet中的信号加到当前线程的屏蔽集中),SIG_UNBLOCK (将sigSet 中的信号从当前线程屏蔽集中删除),SIG_SETMASK (将sigSet 设为当前线程的屏蔽集)。 若oldSigSet != NULL,则将之前的信号屏蔽集存入其中。
  9. 另外还有个函数 sigprocmask() 也有类似功能。区别是:pthread_sigmask() 是线程库函数,用于多线程进程。sigprocmask() 是旧的实现,用于单线程的进程。
  10. sigwait(sigset_t* sigSet, int* sigNum) : 当前线程等待 sigSet 中的信号。没有捕获到信号时,线程挂起;当捕获到时,函数返回,并将信号值存入 sigNum。
  11. sigaction(int sigNum, sigaction* newAct, sigaction* oldAct) : 捕获信号 sigNum,并调用相应的处理函数(定义在 newAct 中)。
  12. 虽然sigwait() 和 sigaction() 都是用于捕获信号,但两者还是有较大区别:sigwait() 是阻塞的,线程会一直挂起直到捕获到信号,并且对信号的处理是定义在 sigwait()后的,只会在当前线程内执行;而sigaction()是非阻塞的,当信号被捕获时,会由进程内当前被调度到的线程来执行处理函数(好像是,not very sure...),被哪个线程处理是随机的。
  13. 所以,sigaction()适用于对实时性要求很高的时候。而在普通情况下建议使用sigwait(),因为其具有较好的可控性。
  14. 另外,还需要注意的是,SIG_KILL(大家应该都用过kill -9 吧) 和 SIG_STOP 是不能被用户屏蔽或捕获的。
  15. 好了,当理解了这几个函数后,可以自己试着来对信号进行处理了。对于lz的需求,简单举例如下:
  16. sigset_t blockSet, waitSet;
  17. int sigNum;
  18. sigfillset(&blockSet); // open all signals in blockSet
  19. pthread_sigmask(SIG_BLOCK, blockSet, NULL); //block all signals (except SIG_KILL & SIG_STOP also) in current thread
  20. sigemptyset(&waitSet); // empty all signals in waitSet
  21. sigaddset(&waitSet, SIG_XXX); // a signal wanted to be captured
  22. sigaddset(&waitSet, SIG_YYY); // another signal wanted to be captured
  23. if ( sigwait(&waitSet, &sigNum) != 0 ) // wait for wanted signals
  24. {
  25. perror("Error - sigwait() is failure!\n");
  26. exit(1);
  27. }
  28. switch (sigNum)
  29. {
  30. case SIG_XXX:
  31. printf("SIG_XXX is captured!\n");
  32. break;
  33. case SIG_YYY:
  34. printf("SIG_YYY is captured!\n");
  35. break;
  36. default:
  37. printf("Error - cannot reach here!\n");
  38. exit(1);
  39. }
  40. return OK;
  41. 另外,用 sigaction() 也可以实现

阅读(1008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~