免费注册 查看新帖 |

Chinaunix

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

请教一个signal的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-23 21:51 |只看该作者 |倒序浏览
初学signal,编写了如下测试代码:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>

int num = 0;

void func(int a){
    printf("in func a=%d\n",a);
    printf("num is %d\n", num);
    if(num >= 10)exit(0);
    num++;
}

int main(){
    while(1)
    {
        signal(SIGINT, func);
        sleep(100);
        printf("sleep\n");
    }
   
    return 0;
}

发现每次触发信号会直接跳出sleep函数,而如果自己写一个类似sleep的函数:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>

int num = 0;

void func(int a){
    printf("in func a=%d\n",a);
    printf("num is %d\n", num);
    if(num >= 10)exit(0);
    num++;
}

void my_sleep(){
    int i = 0;
    printf("alarm\n");
    while(i < 1000000000){
        i++;
    }
}

int main(){
    while(1)
    {
      signal(SIGINT, func);
            my_sleep();
            printf("sleep\n");
    }
   
    return 0;
}
则发现signal执行完毕后回到了my_sleep的循环中而不像sleep那样,请教下到底是为什么?多谢多谢

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2012-05-23 22:19 |只看该作者
那要看sleep的语义。sleep利用系统调用nanosleep休眠,收到信号后nanosleep会返回。返回后会怎么样就看库函数怎么实现,或者说看POSIX怎么规定了。

论坛徽章:
0
3 [报告]
发表于 2012-05-23 22:25 |只看该作者
回复 2# tempname2

也就是说信号首先使得sleep中断然后再触发signal?我以为是一遇到信号就触发signal然后返回再处理额,多谢了

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
4 [报告]
发表于 2012-05-23 22:29 |只看该作者
回复 3# tonyhawkwen


不是。sleep本身是通过系统调用实现休眠的,信号处理完后,系统调用返回,继续执行sleep下面的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP