免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4547 | 回复: 10
打印 上一主题 下一主题

[C] sigsuspend函数的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-31 23:13 |只看该作者 |倒序浏览
2可用积分
下面是APUE2中程序10_16,问题见程序中描述:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>

  4. volatile sig_atomic_t           quitflag;
  5. static void sig_handler(int signo);

  6. int main(int argc, char** argv)
  7. {
  8.         struct sigaction                        act1, act2;
  9.         sigset_t                                newmask, oldmask, zeromask;

  10.         act1.sa_flags = 0;
  11.         act1.sa_handler = sig_handler;
  12.         sigemptyset(&act1.sa_mask);
  13.         if(sigaction(SIGINT, &act1, NULL) < 0){
  14.                 perror("sigaction SIGINT");
  15.                 exit(1);
  16.         }

  17.         act2.sa_flags = 0;
  18.         act2.sa_handler = sig_handler;
  19.         sigemptyset(&act2.sa_mask);
  20.         if(sigaction(SIGQUIT, &act2, NULL) < 0){
  21.                 perror("sigaction SIGQUIT");
  22.                 exit(2);
  23.         }

  24.         sigemptyset(&newmask);
  25.         sigemptyset(&zeromask);
  26.         sigaddset(&newmask, SIGQUIT);
  27.         if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0){
  28.                 perror("sigprocmask SIG_BLOCK");
  29.                 exit(3);
  30.         }

  31.         sleep(10);//加了sleep以后,1。运行程序按ctrl+\(没有反应,因为sleep,SIGQUIT还没有被sigsuspend检测到),紧接着按ctrl+c,程序立即结束,前后操作时间没有超过10s,为什么进程会终//止呢?  2。运行程序后按ctrl+c,打印caught  SIGINT(是期望结果),立即按ctrl+\,程序理解结束?但此时SIGQUIT信号应该被阻塞10s后被sigsuspend检测到并执行信号处理程序,然后//sigsuspend恢复调用前的信号屏蔽字并返回才对(在sig_handler结束后)。
  32. //上面的2个问题不是很明白,是我理解sigsuspend函数错了吗?谢谢大侠指点!
  33.         while(quitflag == 0){
  34.                 sigsuspend(&zeromask);
  35.         }

  36.         quitflag = 0;
  37.         if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0){
  38.                 perror("sigprocmask SIG_SETMASK");
  39.                 exit(4);
  40.         }

  41.         exit(0);
  42. }

  43. static void sig_handler(int signo)
  44. {
  45.         if(signo == SIGINT){
  46.                 printf("\ncaught SIGINT\n");
  47.         }
  48.         if(signo == SIGQUIT){
  49.                 quitflag = 1;
  50.         }
  51. }
复制代码

最佳答案

查看完整内容

每次给的分可真少。 我给你解释一下第一个。运行程序按ctrl+\(没有反应是因为此信号被阻塞,没有提交)。紧接着按ctrl+c,sleep会被打断,去执行sig_handler函数。sig_handler返回后,sigsuspend也会返回,并把信号屏蔽字设置为以前的屏蔽字,也就是ctrl+\信号被解除了。ctrl+\解除后,要提交这个信号,所以执行sig_handler函数,quitflag被置1,退出while循环,然后程序退出。第二个你自己分析吧。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-12-31 23:13 |只看该作者
每次给的分可真少。
我给你解释一下第一个。
运行程序按ctrl+\(没有反应是因为此信号被阻塞,没有提交)。
紧接着按ctrl+c,sleep会被打断,去执行sig_handler函数。
sig_handler返回后,sigsuspend也会返回,并把信号屏蔽字
设置为以前的屏蔽字,也就是ctrl+\信号被解除了。ctrl+\解除后,
要提交这个信号,所以执行sig_handler函数,quitflag被置1,
退出while循环,然后程序退出。
第二个你自己分析吧。

论坛徽章:
0
3 [报告]
发表于 2008-01-01 00:04 |只看该作者
sigsuspend()  temporarily  replaces the signal mask of the calling process with the
       mask given by mask and then suspends the process until delivery of a  signal  whose
       action is to invoke a signal handler or to terminate a process.

论坛徽章:
0
4 [报告]
发表于 2008-01-01 12:45 |只看该作者

回复 #2 lenovo 的帖子

你书看的好仔细啊,这点你都能想到,佩服!
那得给多少分才算多啊???!!!

论坛徽章:
0
5 [报告]
发表于 2008-01-01 13:14 |只看该作者

回复 #2 lenovo 的帖子

呵呵,我来解释第2个吧!
运行程序按ctrl+c,sleep会被打断并执行sig_handler函数。
sig_handler返回后,sigsuspend也会返回,并把信号屏蔽字
设置为以前的屏蔽字,也就是ctrl+\信号被解除了。
此时再按ctrl+\,因为此时ctrl+\信号已经被解除了进程不会再阻塞
SIGQUUIT信号了,所以进程接收这个信号并执行sig_handler函数
将quitflag置1,while循环退出,进程结束。

论坛徽章:
0
6 [报告]
发表于 2008-01-01 13:24 |只看该作者

回复 #2 lenovo 的帖子

你所说的:刚开始运行程序按ctrl+\(没有反应是因为此信号被阻塞,没有提交),
是因为sleep的缘故SIGQUIT信号才被阻塞吧?(确切的说是sigprocmask(SIG_BLOCK.....)设置了阻塞该信号,sleep延缓了SIGQUIT信号提交给sigsuspend,测试的结果按ctrl+\后等待10s后进程结束),我想就是这样的吧?
如果不加sleep的话,SIGQUIT信号会被立刻捕捉,是因为sigsuspend函数接收到信号后,立即恢复信号屏蔽字为它的参数,这样就解除了对SIGQUIT信号的阻塞,所以程序会立即结束(测试结果是这样的)

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2008-01-01 18:52 |只看该作者
〉〉sleep延缓了SIGQUIT信号提交给sigsuspend
应该这样说,因为SIGQUIT被阻塞了,所以sleep没有被打断执行。

论坛徽章:
0
8 [报告]
发表于 2008-01-01 22:04 |只看该作者

回复 #7 lenovo 的帖子

高手说话就是有水准啊!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2008-01-01 22:07 |只看该作者
原帖由 xiaozhu2007 于 2008-1-1 22:04 发表
高手说话就是有水准啊!

我也不是什么高手,
看书一是要仔细,认真,
二是要慢慢品味作者的意思。

论坛徽章:
0
10 [报告]
发表于 2008-01-01 23:08 |只看该作者

回复 #9 lenovo 的帖子

呵呵以前看过一遍,看完了发现自己什么都不会,现在是第2遍,边看边照着书上的例子在机器上实践,感觉这样的效果不错,但是就是进度会慢许多,整了将近2个月才搞定前10章。
确实是该看仔细点的,把书上的例子一修改往往就发现问题了呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP