gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:42:41 27 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

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

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

关于c - 使用 fread() 挂起直到被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16377810/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com