/dev/null 是如何实现的?

/dev/null 是如何实现的?

我不明白当进程写入这个特殊文件时会发生什么。所有字节会发生什么?为什么写入 /dev/null 不占用 CPU 资源?如果你能根据 Linux 源代码的参考来回答,那就太棒了。

Arch论坛上有这样的答案:

缓冲区只是被忽略。

但是,当我执行例如 cat /dev/urandom > /dev/null 时,必须调用 write_null 函数多次,或者可能只调用一次,而且我不明白缓冲区是如何工作的。

答案1

在Linux中,/dev/null是由许多函数实现的,包括write_null:

static ssize_t write_null(struct file *file, const char __user *buf,
              size_t count, loff_t *ppos)
{
    return count;
}

正如您所看到的,缓冲区完全被忽略,函数所做的只是返回要求写入的字节数。

该函数可以被调用任意多次,并且每次调用都会产生少量的成本(调用内核的成本)。如果你跑

cat /dev/zero > /dev/null

该成本可能占主导地位。cat重复地从其输入(或给定的文件)中读取并写入其输出,直到耗尽要读取的内容或无法写入。然而,当阅读时/dev/urandom读取更加复杂,我预计这些将占主导地位。在这两种情况下,所有“I/O”都是 CPU 驱动的,并且cat最终会使用相当数量的 CPU(一个逻辑 CPU 的 100%)——最终会write_null尽可能快地进行内核调用,但这不会执行任何操作尽可能快。

在更典型的情况下,/dev/null例如,当用于丢弃程序的信息输出时,写入次数将少得多,并且与程序正在执行的其他操作相比,它们的总体成本可以忽略不计。

(顺便说一句,您会在上面链接的代码中找到/dev/zerojust after的实现。)/dev/null

相关内容