免费注册 查看新帖 |

Chinaunix

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

问一个关于linux select返回EBADF错误的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-03 16:18 |只看该作者 |倒序浏览
本帖最后由 参天大熊 于 2012-03-03 16:19 编辑

因为一些原因,我在一个文件中使用了connect函数得到一个fd,然后作为参数传递到另外一个文件的函数中,调用select结果就错误返回EBADF了,我在本文件中使用select 是没有问题的。
这是什么原因?如果一定要在另外一个文件的函数中使用select,应该怎么办?

论坛徽章:
0
2 [报告]
发表于 2012-03-03 16:19 |只看该作者
无代码,无真相

论坛徽章:
0
3 [报告]
发表于 2012-03-03 16:35 |只看该作者
本帖最后由 参天大熊 于 2012-03-03 16:39 编辑

文件A中:fd = connect(.....)
SELSCTT(fd);   ///这个SELCTT是文件B中的
文件B中:
int  SELSCTT(fd )
{
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
select(fd + 1, fd, NULL, NULL, &timeout).....
}
这样就悲剧了。整个代码比较庞大,其中可能还有一些头文件等等各种乱七八糟的问题,(里面很多函数原型甚至select都有可能是不一样的)
如果就根据我贴出的代码无法判断的话,那么亲,如果在一个函数中connect得到fd传到另外一个函数中select这种行为本身是否是可行的?
sanbiangongzi 发表于 2012-03-03 16:19
无代码,无真相

论坛徽章:
0
4 [报告]
发表于 2012-03-03 16:41 |只看该作者
回复 3# 参天大熊


描述符作为线程级的资源,有操作系统分配,
在一个线程中是有效的,
函数/或者文件,只是源码的组织方式,
两个是不同的概念,所以
无所谓fd只在哪个函数中有效的概念。

由你给出的这些信息,我也无法看出问题。

建议:

在connect之后,大约一下fd和pid
然后在select时候再打印一下fd和pid,
先看看有无差异再说。




   

论坛徽章:
0
5 [报告]
发表于 2012-03-03 16:45 |只看该作者
回复 3# 参天大熊

select的原型是:
    int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

你的代码中不是这样哦

论坛徽章:
0
6 [报告]
发表于 2012-03-03 17:24 |只看该作者
我这里是自己打错了,使用的时候是对的
我去打印一下FD和pid

你说的那个关于fd的有效范围的信息很有用,多谢~回复 4# sanbiangongzi


   

论坛徽章:
0
7 [报告]
发表于 2012-03-03 19:28 |只看该作者
还有一个问题。
现在在一个嵌入式环境中select函数被定义了两次,一个能监视远端一个能监视串口,但是我想同时监视远端和串口,有什么好的解决方法

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2012-03-03 21:25 |只看该作者
sanbiangongzi 发表于 2012-03-03 16:41
回复 3# 参天大熊

fd是进程资源,在一个进程内有效。应该在子进程中也有效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP