繁体   English   中英

write() 失败时会发生什么?

[英]What happens on write() fail?

如果我在循环中将单个字符写入 STDOUT 1MB 次,此时系统的 RAM 和磁盘大小均为 128KB。

char c = 'c';
for (int i = 0; i < 1024*1024*1024; i++)
    write(STDOUT_FILENO, &c, 1);

在某个时刻,写入会失败,对吧? 程序会终止吗? 它会继续 write() 返回 -1 吗?

我假设您将程序的 output 重定向到小磁盘上的文件。

程序不会终止。 write()失败时,它返回-1并将errno为失败的原因(可能是ENOSPC )。 如果您不检查返回值,您将继续循环并且不会写入任何内容。

这取决于您的程序 output 发生的情况以及环境本身的一些事情。

孤立地 - 不会发生任何有趣的事情,您将打印出 1GB 的c将被连接到 output 的东西(例如终端)消耗。 output 将开始从其回滚缓冲区中删除旧文本行,并保持 memory 的使用或多或少保持不变。

如果 output 被重定向到试图缓冲所有 output 的东西,它会在某个时候用完 memory 并被 OOM-killer 杀死。 此时,您的应用程序将收到SIGPIPE信号并崩溃(除非您有处理程序)。

或者,您的 output 可能会被知道存储空间不足的接收端阻止。 然后你的返回值是-1并且 errno 准确地指定出了什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM