使用fread()挂起直到被杀死

时间:2013-05-04 18:52:37

标签: c

这是我的代码的一般结构:

if (contentLength > 0)
{
    // Send POST data
    size_t sizeRead = 0;
    char buffer[1024];
    while ((sizeRead < contentLength) && (!feof(stream)))
    {
        size_t diff = contentLength - sizeRead;
        if (diff > 1024)
            diff = 1024;

        // Debuging
        fprintf(stderr, "sizeRead: %zu\n", sizeRead);
        fprintf(stderr, "contentLength: %ul\n", contentLength);
        fprintf(stderr, "diff: %zu\n", diff);

        size_t read = fread(buffer, 1, diff, stream);
        sizeRead += read;

        exit(1);

        // Write to pipe
        fwrite(buffer, 1, read, cgiPipePost);

        exit(1);
    }
}

但是,程序在遇到fread()行时会挂起。如果我在该行之前添加一个exit(),程序就存在了。如果我之后添加它,程序会挂起,直到我发送SIGINT信号。

任何帮助都会受到赞赏,我已经坚持了很长一段时间了。

由于

1 个答案:

答案 0 :(得分:1)

fread尝试填充内部缓冲区。根据实现,您可以通过设置缓冲模式来停止或限制它(特别是,设置_IONBF,请参阅setbuf,适用于所有实现)。但是,一般规则是避免在带有stdio的套接字上混合计数I / O,以使用原始read调用。

此外,虽然它没有在这里咬你,但!feof(stream)测试几乎总是错误的:人们认为这是预测性的(EOF即将发生),但feof只是“后期” “:读取操作失败后(getcfgetc返回EOF),feofferror指示符可让您发现上次失败的原因。