Помимо «все является файлом» и, следовательно, простоты использования везде, на чем основано большинство других ответов, существует также проблема с производительностью, как упоминает @user5626466.
Чтобы показать это на практике, мы создадим простую программу с именемnullread.c
:
#include <unistd.h>
char buf[1024*1024];
int main() {
while (read(0, buf, sizeof(buf)) > 0);
}
и скомпилируйте его сgcc -O2 -Wall -W nullread.c -o nullread
(Примечание :мы не можем использовать lseek (2 )для каналов, поэтому единственный способ опустошить канал — это читать из него, пока он не станет пустым ).
% time dd if=/dev/zero bs=1M count=5000 | ./nullread
5242880000 bytes (5,2 GB, 4,9 GiB) copied, 9,33127 s, 562 MB/s
dd if=/dev/zero bs=1M count=5000 0,06s user 5,66s system 61% cpu 9,340 total
./nullread 0,02s user 3,90s system 41% cpu 9,337 total
в то время как при стандартном /dev/null
перенаправлении файлов мы получаем гораздо лучшую скорость (из-за упомянутых фактов :меньшее переключение контекста, ядро просто игнорирует данные вместо их копирования и т. д.):
% time dd if=/dev/zero bs=1M count=5000 > /dev/null
5242880000 bytes (5,2 GB, 4,9 GiB) copied, 1,08947 s, 4,8 GB/s
dd if=/dev/zero bs=1M count=5000 > /dev/null 0,01s user 1,08s system 99% cpu 1,094 total
(здесь должен быть комментарий, но он слишком велик для этого и будет совершенно нечитаемым)