这是我的代码的一般结构:
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信号。
任何帮助都会受到赞赏,我已经坚持了很长一段时间了。
由于
答案 0 :(得分:1)
fread
尝试填充内部缓冲区。根据实现,您可以通过设置缓冲模式来停止或限制它(特别是,设置_IONBF
,请参阅setbuf
,适用于所有实现)。但是,一般规则是避免在带有stdio的套接字上混合计数I / O,以使用原始read
调用。
此外,虽然它没有在这里咬你,但!feof(stream)
测试几乎总是错误的:人们认为这是预测性的(EOF即将发生),但feof
只是“后期” “:读取操作失败后(getc
或fgetc
返回EOF
),feof
和ferror
指示符可让您发现上次失败的原因。