Я искал в /dev и наткнулся на несколько файлов, включая null
. Я хотел посмотреть, что было в файле, поэтому я сделал hx null
, но ничего не произошло, и он выдал ошибку File null is not a regular file
. Что вызывает это сообщение?
решение1
Несколько объектов /dev
впсевдоустройстваи обрабатываются непосредственно функциями ядра. Наиболее часто используемые из них:
/dev/null
: универсальный сток бесконечной емкости. Используется для сброса вывода: tryecho 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.