Что такое /dev/null и почему я не могу использовать hx для него?

Что такое /dev/null и почему я не могу использовать hx для него?

Я искал в /dev и наткнулся на несколько файлов, включая null. Я хотел посмотреть, что было в файле, поэтому я сделал hx null, но ничего не произошло, и он выдал ошибку File null is not a regular file. Что вызывает это сообщение?

решение1

Несколько объектов /devвпсевдоустройстваи обрабатываются непосредственно функциями ядра. Наиболее часто используемые из них:

  • /dev/null: универсальный сток бесконечной емкости. Используется для сброса вывода: try echo foo >/dev/null. Чтение из него возвращает пустой поток байтов (немедленный EOF).
  • /dev/zero: бесконечный источник 0x00байтов. Часто используется в качестве входных данных для перезаписи нулей.
  • /dev/random, /dev/urandom: бесконечные источники случайных байтов.

решение2

На самом деле, ни один из других ответов, похоже, не отвечает на вопрос, почему hx отказывается работать с /dev/null. Причина, по которой hx реагирует таким образом, заключается в том, что он был запрограммирован на вывод этого сообщения об ошибке для файлов устройств.

Отhttps://github.com/krpors/hx/blob/develop/editor.c#L125:

if (!S_ISREG(statbuf.st_mode)) {
        fprintf(stderr, "File '%s' is not a regular file\n", filename);
        exit(1);

Это означает, что hx специально отказывается работать со всем, что не является обычным файлом. Я не думаю, что есть очень веская причина для этой проверки - без нее я бы ожидал, что это /dev/nullсработает с hx, в том смысле, что hx прочтет пустой файл, и любые обновления к нему будут потеряны при их сохранении.

(Это предполагает, чтоhttps://github.com/krpors/hx/это действительно та программа hx, о которой говорит автор постера)

решение3

/dev/nullпо сути, это способ отбросить информацию.

Главная цель — просто иметь возможность предать вещи забвению.

echo 'duck' > /dev/null

подавит сообщение, переданное по echo 'duck'адресу, /dev/nullи, следовательно, будет отброшено.

Это в основном используется при использовании команд, вывод которых вам не нужен.

Чтение /dev/nullнемедленно возвращает конец файла, т.е. действует как пустой файл.

Есть и другие забавные вещи, /devнапример random, которые дадут вам случайные данные; не совсем то, что вы ожидаете от "файла" :) Стоит отметить, что /dev/randomэто действительно случайные данные, собранные из использования в системе (время между нажатиями клавиш и тому подобное), и этот пул может быть исчерпан довольно быстро. /dev/urandomдать вам то, что кажется случайным числом, но вычисляется по математической формуле. Обычно /dev/urandomподходит для ваших нужд, но, например, для очень сильных криптографических ключей этого недостаточно.

Вы также можете выполнить чтение, /dev/zeroчтобы получить бесконечный поток нулевых байтов.

решение4

/dev/nullпредставляет собой файл символьного устройства, т.е. интерфейс к драйверу устройства.

Это конкретное устройство является фиктивным устройством (не представляющим собой настоящее оборудование). Оно специально сделано, чтобы быть бездонной мусорной корзиной; в нее можно сбрасывать вывод любой программы, если вы не хотите, чтобы он был на виду или где-то еще.

  • Что касается содержания, если бы вы действительно попыталисьчитатьэтот файл (да тыможетпрочитай это),это будетвсегдабыть эквивалентен пустому файлу длиной 0 байт.

Я не знаю, что это за hxкоманда, но из вашего описания я могу предположить, что это команда для определения типа файла.по его содержанию. Команда, которую я использую в своей системе GNU/Linux для этой задачи, — file, и она также останавливается, если обнаруживает, что файл не является обычным файлом...

$ file /dev/null
/dev/null: character special

Но fileкоманда также предоставляет -sопцию, которая заставляет его читать независимо...

$ file -s /dev/null
/dev/null: empty

Может быть, в вашей hxкоманде есть похожая опция, которую вы можете использовать?

Причина, по которой file(а может быть, и ваша hxкоманда тоже) не идентифицирует нестандартные файлы по умолчанию, указана в документации к -sопцииfileСтраница руководства пользователя, а именно...

  • Чтение этих файлов может вызвать побочные эффекты, которые иногда нежелательны.
    • Чтение из канала FIFO потребляет данные в нем навсегда, вы не можете отправить считанные данные обратно в канал.
    • Чтение из файла устройства приводит к изменению устройства...
      • Чтение с ленточного устройства приводит к смещению положения головки ленты.
      • Чтение с устройства последовательного порта приводит к потреблению буферизованных входных байтов.
      • Чтение с устройства случайных чисел приводит к истощению пула энтропии системы.
      • И многое другое, в зависимости от драйвера соответствующего устройства.
  • Идентификация этих специальных файловпо содержаниютребует гораздо больше работы и гораздо меньше уверенности:
    • Размер контента заранее неизвестен (или ioctl()для его получения потребуются специальные системные вызовы).
    • Во многих случаях поиск не сработает.
    • Для обнаружения типов файлов, которые полагаются на сигнатуру конца файла, потребуется прочитать весь документ.
    • Некоторые из этих файлов даютбесконечныйсодержание.

Если ваша программа не предназначена для выполнения необходимых работ, то она может оказаться неспособной идентифицировать содержимое нестандартных файлов и будет прервана в качестве меры предосторожности.

  • Если программа будет продолжена без этой проверки безопасности, это может привести квешать, акрушениеили, что еще хуже, привести к сбою системызакончилась память; в зависимости от дизайна рассматриваемой программы.

Если это так, то это ограничение вашей программы; используйте его file -sдля целей идентификации.


Приложение

Если hxвашнаподобиешестнадцатеричный/двоичныйредактор;тогда это особенноНЕ рекомендуетсяиспользовать его для открытия специальных файлов, о которых вы не знаете. Hexредакторыобычно предварительная загрузкавесь файлв память для ваших операций редактирования.

По этой причине, если вы попытаетесь открыть файл устройства с бесконечным содержимым (например, /dev/zeroили /dev/urandom) или даже большое конечное устройство (например, /dev/sda), это может привести вашу систему в состояниесостояние нехватки памяти, для восстановления которого вам может потребоваться выполнить сброс всего компьютера.

Проверка безопасности, которую вы только что запустили, скорее всего, призвана уберечь вас от такого сценария. (Как уже упоминалось: размер содержимого файла устройства заранее неизвестен — программа не может заранее определить, достаточно ли у вас памяти для его загрузки или нет)

В случае, если вы просто хотите «заглянуть» в заголовок файла, неважно что;использовать шестнадцатеричныйзрительвместо, нравитьсяhexdump(рекомендуется) или старой школыod. Например:

  • hexdump -C -n 512 /dev/null(Содержимое будет пустым)
  • hexdump -C -n 512 /dev/urandom(Каждый раз контент будет представлять собой разную тарабарщину)

^ -n 512Опция ограничивает просмотр первыми 512 байтами. Но даже если вы это пропустили и вас засыпало бесконечным выводом, все, что вам нужно сделать, чтобы остановить это, — просто нажать Ctrl+C.

Связанный контент