0

我正在编写一个围绕通用文件操作的包装器,并且不知道如何处理当 write 返回一个较小大小的情况时写入然后提供。

write的手册页说:

写入的字节数可能少于 count,例如,底层物理介质上的空间不足,或者遇到 RLIMIT_FSIZE 资源限制(参见 setrlimit(2)),或者调用被信号处理程序中断后写入少于 count 个字节。(另请参见管道 (7)。)

根据我对上述内容的理解,这是错误(中满)和返回(中断呼叫)的混合。如果我的文件描述符都是非阻塞的,我不应该得到中断情况,那么唯一的原因就是一个错误。我对吗 ?

代码示例:

int size_written = write(fd, str, count);
if (size_written == -1) {
  if (errno == EAGAIN) {
    // poll on fd and come back later
  } else {
    // throw an error
  }
} else if (size_written < count) {
  // ***************
  // what should I do here ?
  // throw an error ?
  // ***************
}
4

1 回答 1

2

您需要在循环中使用原始 I/O 函数:

ssize_t todo = count;

for (ssize_t n; todo > 0; )
{
    n = write(fd, str, todo);
    if (n == -1 && errno != EINTR)
    {
        // error
        break;
    }
    str += n;
    todo -= n;
}

if (todo != 0) { /* error */ }

有关的特殊条件EINTR允许写入调用被信号中断而不会导致整个操作失败。否则,我们希望最终能够写入所有数据。

如果由于文件描述符是非阻塞的并且目前无法接受任何数据而无法完成所有数据的写入,则必须存储剩余的数据并稍后在文件描述符发出可以再次写入的信号时重试。

于 2014-02-06T21:16:41.820 回答