Chinaunix
标题:
大家看看下面这个非阻塞带超时读写有问题吗,谢谢。
[打印本页]
作者:
soulskylove
时间:
2008-12-21 18:15
标题:
大家看看下面这个非阻塞带超时读写有问题吗,谢谢。
因为需求的缘故,读写部分数据后超时,则此次读写的数据可以丢掉,所以那里直接返回-1了,没有返回读写到的实际数目。代码是小弟写的,但是小弟心里总觉得可能有更好的写法,想问问大家是怎么做的呢?望各位大侠指教。
int read_with_timeout(int fd, void *buf, uint32_t count, int timeout)
{
struct pollfd pollfd;
uint32_t have_io = 0;
int ret;
pollfd.fd = fd;
pollfd.events = POLLIN;
while (count != have_io) {
ret = poll(&pollfd, 1, timeout);
if (ret < 0 && errno == EINTR) /* Signal interrupt */
continue;
if (ret <= 0) /* Error or Timeout */
return -1;
if (pollfd.revents & POLLIN) {
ret = read(fd, buf + have_io, count - have_io);
if (ret <= 0 ) /* Error or closed */
return -1;
have_io += ret;
}
}
return have_io;
}
int write_with_timeout(int fd, const void *buf, uint32_t count, int timeout)
{
struct pollfd pollfd;
uint32_t have_io = 0;
int ret;
pollfd.fd = fd;
pollfd.events = POLLOUT;
while (count != have_io) {
ret = poll(&pollfd, 1, timeout);
if (ret < 0 && errno == EINTR) /* Signal interrupt */
continue;
if (ret <= 0) /* Error or Timeout */
return -1;
if (pollfd.revents & POLLOUT) {
ret = write(fd, buf + have_io, count - have_io);
if (ret <= 0 ) /* Error or closed */
return -1;
have_io += ret;
}
}
return have_io;
}
[
本帖最后由 soulskylove 于 2008-12-21 19:11 编辑
]
作者:
cookis
时间:
2008-12-21 18:49
1. 代码风格不错, 有前途.
2.
if (ret <= 0 && errno != EINTR) /* Error or timeout */
return -1;
else
continue; /* Signal interrupt */
复制代码
这段不对, 你这肯定得不到可读事件. 你都continue了.
3. 传统做法都是用select, 至于poll有缺点, 我一会去翻翻斯蒂温的书看看.
作者:
soulskylove
时间:
2008-12-21 19:02
谢谢 楼上大侠指正
[
本帖最后由 soulskylove 于 2008-12-21 19:24 编辑
]
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2