gpt4 book ai didi

c++ - write(2) 返回零意味着什么,我最终会取得进展(非零结果)吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:33 26 4
gpt4 key购买 nike

我有一个 TCP 套接字,我正在用 C++03 程序写入。在某些情况下,我从 write() 得到零返回结果。 write(2) 手册页部分说明:

On success, the number of bytes written is returned (zero indicates nothing was written). On error, -1 is returned, and errno is set appropriately.

那么,零是否真的意味着没有错误,我应该再次调用 write 直到我写完所有内容?换句话说,我是否应该像我已经为部分写入所做的那样处理零,其中写入的字节数小于我传递给 write 的 count 并继续尝试直到达到总数写入了 count 个字节?

我想确保我不会陷入无限循环,写入连续返回零并且永远不会取得进展。我应该先调用 select() 以确保文件描述符在调用 write 之前准备就绪吗?我在文件描述符上启用了阻塞。

最佳答案

虽然从理论上讲,它最终可能会通过或出错,但我会建立一些针对无限循环的安全措施,以防万一。

调用 select 等待硬件可能会工作(这肯定比立即再次循环尝试要好,这几乎肯定会浪费一些 CPU 时间 - 多少取决于很多事情) , 但它是 TOCTOU问题 - 您系统中的某些其他程序可能比您先到达那里,并且(再次)在您开始 write 时填满了可用于传输的系统内存。

所以,我会按照这些思路做一些事情:

int write_zero_count = 0; 

while(not_all_written)
{
int res;
res = select(...);
... check if we can write, etc ...
res = write(...);
if (res == 0)
{
write_zero_count++;
if (write_zero_count > max_zero_writes)
{
error("Got many writes that sent zero bytes, not good");
.... do other stuff to log and recover from error or exit? ...
}
}
else
{
write_zero_count = 0;
}
}

关于c++ - write(2) 返回零意味着什么,我最终会取得进展(非零结果)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625725/

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