一个关于poll与线程的问题

KevinCao 2008-08-30 01:40:13
主线程接受连接,并且poll所有连接的pollin事件,处理客户端发送过来的数据:

client[max_fd].events = POLLIN;
int ready = poll (client, max_fd + 1, timeout);
recv(fd);

另外开了一个线程,用主线程的连接句柄进行数据发送
send(fd);

现在问题是如果接受客户端数据没有问题,但是发送线程一调用send(fd),主线程poll就会返回1,并且在该fd句柄上报pollerr和pullhup错误,但是数据确实通过socket发送到客户端了,但是我主线程收到pollerr之后就只好关闭连接了
为什么fd上在poll会报错呢?

谢谢各位指点,感谢先

...全文
373 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
KevinCao 2008-09-02
  • 打赏
  • 举报
回复
修改完成了,用了一个fifo做进程同步机制,把发送的句柄加到主进程解决
还是谢谢sailing0123的回答,至少给我一个思路实现了
KevinCao 2008-08-30
  • 打赏
  • 举报
回复
但是这个socket要用来接受用户请求啊,如果不加到poll里面,怎么知道用户发送数据上来了?
你说的socket句柄不加到poll里面,是指什么意思呢?难道发送的时候从poll条件中去掉对这个句柄的轮循,等发送完成后再加进去?还有再新开一个连接?
KevinCao 2008-08-30
  • 打赏
  • 举报
回复
查了一下,poll返回pollhup的原因是正在写句柄,所以句柄被挂起,这个倒是解释通了,但是为什么pollin和pollerr会产生呢?
觉得自己真不是个搞技术的料
sailing0123 2008-08-30
  • 打赏
  • 举报
回复
注意,
发送的socket不要加入到Poll里面,
这样发送就不会影响poll了。
KevinCao 2008-08-30
  • 打赏
  • 举报
回复
从理论上来说,对句柄send会影响poll函数中的pollin事件嘛?
KevinCao 2008-08-30
  • 打赏
  • 举报
回复
主线程我是用strace工具确认poll函数返回1,大概是poll[fd3(events=pollin),fd4(events=pollin),fd5(events=pollin, revents=pollin|pollerr|pollhup)] = 1,
其中fd5就是发送线程发送数据的时候句柄

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧