[英]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.