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时对路径的理解问题。