免费注册 查看新帖 |

Chinaunix

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

[C] signal疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-17 16:14 |只看该作者 |倒序浏览

我在一个程序中用 signal(SIGINT, action)

action(int sig)
{
    printf("xxxxxxxx\n");
}

但是运行程序后,第一次按CTRL+C 就可以进入action,  第二次按CTRL+C 程序还是退出了,为什么会这样

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-11-17 16:43 |只看该作者
第二次就被设置为SIG_DFL了 ,用sigaction这个接口函数

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2016-04-23 22:00:26
3 [报告]
发表于 2014-11-17 20:59 |只看该作者
顶                           

论坛徽章:
0
4 [报告]
发表于 2014-11-17 22:11 |只看该作者
man一下海阔天空。

信号截获可以是一次性也可以是嵌套的,可设。

论坛徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午马
日期:2014-10-19 13:40:31酉鸡
日期:2014-11-08 08:44:54处女座
日期:2014-11-10 17:01:21午马
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之广夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
5 [报告]
发表于 2014-11-17 22:30 |只看该作者
本帖最后由 wangspace 于 2014-11-17 22:31 编辑

http://hi.baidu.com/hehehehello/item/1c6853e3ade214c3baf37d69
特别注意:有资料称自定义handler仅在初次收到信号时有效(如果要改变此操作请改用sigaction())
简单搜了下 希望对你有用

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2014-11-18 09:48 |只看该作者
action里面再来一次signal()

论坛徽章:
0
7 [报告]
发表于 2014-11-19 09:30 |只看该作者
回复 1# zouyp1989


    我不知道楼主用的什么Linux,我用的CentOS 6.5,在稍微新一点的Linux系统中(其实主要是gnu libc的版本),signal其实和sigaction调用的是同一个系统调用。所以,效果是一样的,只sigatciont多一些控制而已。我测试的结果是不会出现楼主的情况。下面是我的测试代码,程序里面有个计数,会在重复收到SIGINT 6次以上才会退出(CentOS6.5 测试通过):
  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <unistd.h>

  4. volatile sig_atomic_t   stop_flag = 0;
  5. volatile sig_atomic_t   int_count = 0;


  6. void handler_sigint(int sig)
  7. {
  8.     char msg[] = "I got signal SIGINT\n";

  9.     write(STDERR_FILENO, msg, sizeof(msg));
  10.     if (++int_count > 5) {
  11.         stop_flag = 1;
  12.     }
  13. }


  14. int main()
  15. {
  16.     signal(SIGINT, handler_sigint);

  17.     while (!stop_flag) {
  18.         printf(".\n");
  19.         sleep(1);
  20.     }

  21.     printf("Done!\n");
  22.     return 0;
  23. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP