read()似乎进入了无限循环

时间:2013-01-27 22:15:49

标签: c linux

我正在尝试从套接字读取数据。由于某种原因,我无法理解,似乎读取功能进入无限循环。我认为发生的原因是因为在使用eclipse进行调试时,调试器没有通过读取功能。此外,当我用终端运行程序时,它会永远运行。帮助!

其他信息:在Linux上运行,并且不确定是否与此问题有关,但我在程序中创建了线程。

我认为应该提到的另一件事:第一次调用read()时,它按预期工作,并读取套接字中的整个消息。当第二次再次调用read()时(无需读取任何内容时),问题就开始了。我期望读取将返回0,这将结束函数,但相反,读取进入无限循环。

以下是这一切发生的地方:

read_write_res block_read_reply(int fd, void* buf, int max, int* read_size) {
int flag = 1;
if (read_size != NULL)
    *read_size = 0;
int i;
while (1) {
    i = read(fd, buf, max); /* HERE is where the debbuger gets stuck */
    if (i == 0 && flag == 1) //nothing to read
        continue;
    if (i == 0 && flag == 0)
        return READ_WRITE_SUCCESS;
    if (i < 0){
        return READ_WRITE_FAILURE;
    if (i > 0 && read_size != NULL)
        *read_size += i;
    }
    flag = 0;
    max -= i;
    buf = (char*) (buf) + i;
}
return READ_WRITE_SUCCESS;

}

1 个答案:

答案 0 :(得分:8)

如果read返回0,则表示您已达到文件结束状态。对于套接字或管道,这意味着没有更多内容可供阅读。 EVER。因此,在这种情况下执行continue;绝对不是您想要做的事情。