免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] 【求助一个EPOLL的问题】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-24 10:52 |只看该作者 |倒序浏览
一、验证环境
操作系统:linux 2.6.36
CPU类型: MIPS


二、问题描述
当epoll_wait函数返回后,events.events的值是正确的,但是却发现events.fd始终为零。


三、源代码
epoll.rar (1.99 KB, 下载次数: 11)


四、程序执行的调试信息

#########################
Modify Time: 2013-05-23 18:52
Modify ev.events=EPOLLIN | EPOLLET; USE ET;
Modify SOCK_DGRAM
Modify print events infomation;
####################################


[func:main line:67] listenfd = 0x3
[func:main line:96] ev.events = 0x80000041
[func:main line:97] ev.data.fd = 0x3
epoll descriptor is: 4
listen descriptor is: 3

以上打印信息为客户端触发事件前的服务器端调试信息;


当然,以下打印信息为客户端触发事件后的服务器端调试信息;

Events Come: res=1
0: events.events = 65
0: events.fd = 0


1: events.events = 0
1: events.fd = 0


2: events.events = 0
2: events.fd = 0


3: events.events = 0
3: events.fd = 0


4: events.events = 0
4: events.fd = 0


5: events.events = 0
5: events.fd = 0


6: events.events = 0
6: events.fd = 0


7: events.events = 0
7: events.fd = 0


8: events.events = 0
8: events.fd = 0


9: events.events = 0
9: events.fd = 0


10: events.events = 0
10: events.fd = 0


11: events.events = 0
11: events.fd = 0


12: events.events = 0
12: events.fd = 0


13: events.events = 0
13: events.fd = 0


14: events.events = 0
14: events.fd = 0


15: events.events = 0
15: events.fd = 0


16: events.events = 0
16: events.fd = 0


17: events.events = 0
17: events.fd = 0


18: events.events = 0
18: events.fd = 0


19: events.events = 0
19: events.fd = 0


The 0 events descriptor is: 0
0 error occured, errno: 95

论坛徽章:
0
2 [报告]
发表于 2013-05-25 12:33 |只看该作者
一、怀疑是系统调用过程中的问题。
      这个问题有点难度。


二、当前进展:
1.用户态epoll_ctl函数调用到内核态sys_epoll_ctl后,我增加了一些调试信息,发现:事件类型epds.event的值是正确的,监控的文件描述符epds.data的值始终是零


三、以下为内核态sys_epoll_ctl的源代码:

SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
                struct epoll_event __user *, event)
{
        int error;
        struct file *file, *tfile;
        struct eventpoll *ep;
        struct epitem *epi;
        struct epoll_event epds;

        error = -EFAULT;
        if (ep_op_has_event(op) &&
            copy_from_user(&epds, event, sizeof(struct epoll_event)))        /*event是用户态传递给内核态的参数*/
                goto error_return;

    printk("[func:%s line:%d] epds.events = 0x%x and epds.data = %llu\n",
        __FUNCTION__, __LINE__, epds.events, (__u64)epds.data);

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-05-26 11:57 |只看该作者
啊, 你注册的时候没有赋值data.fd, 返回的时候又怎么可能有值呢?

论坛徽章:
0
4 [报告]
发表于 2013-05-27 11:28 |只看该作者
感谢您。

注册的时候(epoll_ctl),我已给ev.data.fd赋值,详见以下源代码。

源代码如下:

        ev.events = EPOLLIN | EPOLLET | EPOLLRDNORM;
        ev.data.fd = listenfd;

        printf("[func:%s line:%d] ev.events = 0x%x\n", __FUNCTION__, __LINE__, ev.events);
        printf("[func:%s line:%d] ev.data.fd = 0x%x\n", __FUNCTION__, __LINE__, ev.data.fd);
        //epfd
        if(epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev) < 0)
        {
                perror("epoll_ctl adding listenfd:");
                exit(1);
        }

论坛徽章:
0
5 [报告]
发表于 2013-05-27 22:40 |只看该作者
我在注册的时候(epoll_ctl),我已给ev.data.fd赋值,详见以下源代码。

不明白,为什么内核态监控的文件描述符epds.data的值始终是零?

源代码如下:

        ev.events = EPOLLIN | EPOLLET | EPOLLRDNORM;
        ev.data.fd = listenfd;

        printf("[func:%s line:%d] ev.events = 0x%x\n", __FUNCTION__, __LINE__, ev.events);
        printf("[func:%s line:%d] ev.data.fd = 0x%x\n", __FUNCTION__, __LINE__, ev.data.fd);
        //epfd
        if(epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev) < 0)
        {
                perror("epoll_ctl adding listenfd:");
                exit(1);
        }

论坛徽章:
0
6 [报告]
发表于 2013-05-31 09:02 |只看该作者
楼主在吗?

论坛徽章:
0
7 [报告]
发表于 2013-06-04 11:12 |只看该作者
高手在那里啊!

论坛徽章:
0
8 [报告]
发表于 2013-06-05 00:01 |只看该作者
有可能是uClibc库的问题;因为当前使用的是uClibc-0.9.28。

论坛徽章:
0
9 [报告]
发表于 2013-06-06 22:23 |只看该作者
此问题已定位清楚。

原因:交叉编译工具链的Linux内核头文件和uClibc版本低,不支持epoll功能。

论坛徽章:
0
10 [报告]
发表于 2013-06-28 17:06 |只看该作者
可以通过调用syscall(__NR_epoll_wait, ...)来测试内核epoll系统调用是否OK,不一定是uclibc产生的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP