3

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

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 信号。

任何帮助将不胜感激,我已经坚持了很长一段时间了。

谢谢

4

1 回答 1

2

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

此外,虽然它没有在这里咬你,但!feof(stream)测试几乎总是错误的:人们的意思是这是预测性的(EOF 即将发生),但feof只是“后指令”:在读取操作失败(getcfgetc返回EOF)后,feofferror指标可​​以让您发现之前的故障发生的原因。

于 2013-05-04T19:04:53.073 回答