APUE2错误记录

    在14年5月份的时候,看APUE2的信号处理章节,看到“10.10 alarm和pause函数”的时候,其中有一个例子是“超时功能的read函数”;我当时试了试这个代码,但是发现,并没有超时功能,并且在chinaunix论坛上发了提问帖(链接:http://bbs.chinaunix.net/thread-4135617-1-1.html)。

   具体代码如下:

 

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

void sig_alarm(int )
{
    printf("==========alarm clock!==============\n");
}
void test_alarm()
{
    alarm(3);
    char buf[1024] = {0};
    int len = read(STDIN_FILENO,buf,1024);
    alarm(0);
    printf("test alarm succed!\n");
}

int main()
{
    signal(SIGALRM,sig_alarm);
    test_alarm();
    return 0;
}

下面是gdb信息:

 

 

[knull@knull sock_raw]$ gstack 5212
#0  0x009b0424 in __kernel_vsyscall ()
#1  0x00c0c8c3 in __read_nocancel () from /lib/libc.so.6
#2  0x08048563 in test_alarm() ()
#3  0x080485aa in main ()

 

 

     今天又看信号处理,看到了“可重入函数”和“alarm和pause函数”两张,顿时想到了这个问题,思考下,终于明白其中奥妙了。

     “超时”read函数,步骤如下:
1、在alarm(3)之后,调用read阻塞在那;
2、在3秒之后,产生alarm信号,于是到注册的自定义信号处理函数;
3、信号处理函数结束之后,由于read是可重入的系统调用函数,于是,就又回到的read的系统调用上。


结论:上述代码,是实现“超时功能的read函数”,但是,却并没有达到超时的效果。所以,这个代码例子本身就是错误的。
(可能,第一版本的时候,read还不是可重入函数;但是,后期第二版本的时候,read被加入到可重入的函数中去了,但是对应的代码没有做修正)
参考:APUE2—10.6:可重入函数;
         APUE2—10.10:alarm和pause函数;中间有一个超时的read函数代码例子。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值