Как › /dev/null поглощает выходные потоки?

Я много раз использовал /dev/null в программировании на bash для отправки ненужного вывода в черную дыру.

Например, эта команда:

$ echo 'foo bar' > /dev/null
$ 

Ничего echo не будет. Я читал, что /dev/null — это пустой файл, используемый для удаления нежелательного вывода посредством перенаправления. Но как именно происходит это избавление? Я не могу себе представить /dev/null запись содержимого в файл, а затем немедленное удаление этого файла. Так что же на самом деле происходит, когда вы перенаправляете на этот файл?


person cs95    schedule 18.06.2017    source источник
comment
Компьютерная черная дыра съела его. Так мне коллега сказал ;-)   -  person Jimbot    schedule 18.06.2017
comment
/dev/null не настоящий файл. Это псевдофайловое устройство, которое просто отбрасывает любые записанные на него данные.   -  person Leon    schedule 18.06.2017


Ответы (1)


>/dev/null перенаправляет стандартный вывод команды на нулевое устройство, которое является специальным устройством, которое отбрасывает записанную на него информацию. Все это реализовано через file_operations (drivers/char/mem.c, если вам интересно посмотреть самому):

static const struct file_operations null_fops = {
    .llseek     = null_lseek,
    .read       = read_null,
    .write      = write_null,
    .splice_write   = splice_write_null,
};

write_null вызывается при записи в /dev/null. Он всегда возвращает то же количество байтов, которое вы ему записываете:

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

Вот и все. Буфер просто игнорируется.

person tso    schedule 18.06.2017
comment
То есть по сути /dev/null является символической ссылкой на какое-то устройство, чье участие в какой-либо операции запускает эту функцию? - person cs95; 18.06.2017