wind_beyonder 发表于 2014-05-02 11:01

学习中,正在看文件I/O一章,体会一切即文件的思想

fedorayang 发表于 2014-05-03 03:26

回复 48# crazyhadoop

精力有限,工作大部分都是做驱动,只有调试驱动的时候,偶尔写一点应用空间的调试程序

   

cryboy2001 发表于 2014-05-05 14:21

围观中..................

qxhgd 发表于 2014-05-06 10:36

本帖最后由 qxhgd 于 2014-05-06 10:37 编辑

开发中使用tcpdump的时候,遇到过select的副作用引起的故障。
select的原型:int select(int nfds, fd_set *rdfds, fd_set *wtfds, fd_set *exfds, struct timeval *timeout)
不同系统上的实现:
POSIX.1标准是允许在实现中修改timeval的值的。
FreeBSD、Mac OS X、Solaris里一般维持不变。
Linux的实现中,几乎一定要被修改的只要配了超时时间,最终或者被修改为0或者被修改为剩余时间。

开始是每隔一定时间发消息出去,但是间隔在调用select之后,被修改导致出现问题。

附:Linux上的select的实现分析:SYSCALL_DEFINE5(select)
{
    if(tvp)            //如果配置了超时时间,select最后一个参数非NULL的情况
    {
       endtime=xxx;   //修改endtime,有点乱,主要是通过timespec_add_safe实现的。
    }
    ret = core_sys_select(n, inp, outp, exp, to);//真正实现超时的地方
    ret = poll_select_copy_remaining(&end_time, tvp, 1, ret);//注意这个1
   
    return ret;
}


static int poll_select_copy_remaining(struct timespec *end_time, void __user *p,
                                      int timeval, int ret)
{

       if (!end_time->tv_sec && !end_time->tv_nsec) //如果前面tvp为Null,那么endtime没被赋值,值未定,这里可能就有问题了。
         return ret;
       ktime_get_ts(&rts);               //获取当前时间
        rts = timespec_sub(*end_time, rts); //计算剩余时间
        if (rts.tv_sec < 0)               //如果为负说明已经超时
                rts.tv_sec = rts.tv_nsec = 0; //清0

        if (timeval) {                     //select系统调用中,timeval为1
                rtv.tv_sec = rts.tv_sec;      //存的是剩余时间(以endtime为参照物),可能为0,
                rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;

                if (!copy_to_user(p, &rtv, sizeof(rtv))) //将剩余时间还给用户态
                        return ret;

        }

}

256893 发表于 2014-05-06 19:13

表示这是c不过关回复 6# sxcong


   

wang290 发表于 2014-05-12 09:15

qxhgd 发表于 2014-05-06 10:36 static/image/common/back.gif
开发中使用tcpdump的时候,遇到过select的副作用引起的故障。
select的原型:不同系统上的实现:
POSIX.1 ...

这个是啥经验?上来就是一段代码,让我等小白情何以堪啊

qxhgd 发表于 2014-05-12 09:32

回复 56# wang290


    select的副作用,超时时间会被select修改。如果循环调用select的话,需要重新对超时时间赋值。

    (*^__^*) 嘻嘻!

wang290 发表于 2014-05-12 09:57

qxhgd 发表于 2014-05-12 09:32 static/image/common/back.gif
回复 56# wang290




不明觉厉

frandos 发表于 2014-05-12 11:43

样章好像没法下载
那两个压缩包下下来后解压都显示错误

sxcong 发表于 2014-05-16 10:36

回复 55# 256893

这个和c没关系的,是从dos转向linux时对路径的理解问题。


   
页: 1 2 3 4 5 [6] 7
查看完整版本: Linux系统开发那点事儿 分享经验得牛人力作!(获奖名单已公布-2014-5-28)