linux下C线程问题????

madisonj 2013-12-26 10:04:51
我在主线程中开了一个子线程用来下载文件(http下载) 在从socket读的时候文件数据读取完成了 线程好像被挂起了一段时间 差不多有10S吧 线程才退出 怎么会这样呢 各位帮我看看什么问题啊???

// 数据接收完成了 好像被挂起了一样等待一会才执行while 后面的 不知道什么原因
while((nres = read(sock, buff, 1)) != 0) {
if (..){
// 跳过header头
}else {
write(fd, buff, 1);
printf("%d\n", i);
}
}
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起来玩玩呗 2013-12-27
  • 打赏
  • 举报
回复
我还以为是程序处理数据需要10s 左右的时间了
初一公主奶爸 2013-12-27
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
[quote=引用 1 楼 letian0805 的回复:] http是基于tcp协议的。对方没有关闭套接字的时候,如果没有数据而且你是阻塞模式的话,read会阻塞。你读完了文件后等待了10秒,可能是服务器端10秒后才关闭套接字,这个可能是服务器设置的10秒超时自动关闭。你应该用非阻塞IO来读取,用select或者epoll或者poll都可以。
这种情况是有可能的,不过也可能是你读取的数据太少了吧!一次读取1个字节吗?!!![/quote] 所以建议他用非阻塞IO。这一次读一个字节,得多慢。
自信男孩 2013-12-27
  • 打赏
  • 举报
回复
引用 1 楼 letian0805 的回复:
http是基于tcp协议的。对方没有关闭套接字的时候,如果没有数据而且你是阻塞模式的话,read会阻塞。你读完了文件后等待了10秒,可能是服务器端10秒后才关闭套接字,这个可能是服务器设置的10秒超时自动关闭。你应该用非阻塞IO来读取,用select或者epoll或者poll都可以。
这种情况是有可能的,不过也可能是你读取的数据太少了吧!一次读取1个字节吗?!!!
ForestDB 2013-12-27
  • 打赏
  • 举报
回复
阻塞在这里了。
兆帅 2013-12-27
  • 打赏
  • 举报
回复

read(sock, buff, 1)
write(fd, buff, 1);
不卡么?
初一公主奶爸 2013-12-26
  • 打赏
  • 举报
回复
http是基于tcp协议的。对方没有关闭套接字的时候,如果没有数据而且你是阻塞模式的话,read会阻塞。你读完了文件后等待了10秒,可能是服务器端10秒后才关闭套接字,这个可能是服务器设置的10秒超时自动关闭。你应该用非阻塞IO来读取,用select或者epoll或者poll都可以。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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