При попытке перенаправить вывод программы с синтаксисом «некоторое число больше, чем» (например foo 2> myfile
), какие здесь возможные числа и что они представляют?
Я считаю, 1 есть /dev/stdout
, 2 есть /dev/stderr
. А как насчет 5 и 6? Есть ли 3, 4 или какое-то число больше 6?
io-redirection
file-descriptors
fifo
Студент Ферма
источник
источник
Ответы:
Эта предполагаемая программа запишет в номер дескриптора файла, который вы указали. рассмотрим следующую программу Hello World:
скомпилируйте это
теперь простой запуск
нет файла для 5, так что ни одного байта не написано.
следующая попытка:
Мне удается получить вывод при указании файла и дескриптора файла (например
5>u
).На практике, если вы не написали такую забавную программу, как указано выше, вы вряд ли соберете данные с помощью
5>foo
.в сценарии оболочки более полезно использовать конструкцию с использованием <():
источник
write()
возвращаетсяssize_t
, нетint
.Числа представляют файловые дескрипторы (дескрипторы файлов, которые были открыты).
Оболочка обычно имеет 3 набора автоматически,
0 - стандартный 1 - стандартный 2 - стандартный
Но в дальнейшем файлы могут быть открыты, и числа увеличиваются.
источник
Эти числа являются файловыми дескрипторами . Как вы заметили, есть несколько, которые создаются автоматически. Когда открываются другие файлы или подобные файлы, они получают другие номера.
Числа, которые используются в любой конкретной программе, зависят от того, какие файлы были открыты этой программой или использованы иным образом. Например, если вы хотите «сохранить» текущий стандартный ввод и временно перенаправить стандартный ввод из другого места, а затем восстановить его позже, вы можете сделать что-то вроде:
Таким образом, этот сценарий будет иметь
4
дескриптор файла, доступный, по крайней мере, в течение некоторого времени. Эта 4 может быть чем-то, что не используется, хотя (ну, есть ограничение на количество файлов, которые может открыть процесс, но все, что находится в пределах этого предела).Вы можете увидеть, какие файловые дескрипторы открыты у процесса, и где они открыты, заглянув внутрь
/proc/<pid>/fd
. Это показывает все дескрипторы открытых файлов для этого процесса<pid>
и с какими файлами они связаны.источник
Любой процесс получает целые числа в качестве файловых дескрипторов, где в POSIX есть три зарезервированных: 0 - это стандартный ввод, 1 - это стандартный вывод, а 2 - это stderr. Любые дальнейшие файлы будут назначены дальнейшие номера. Вы можете проверить это легко с помощью этой программы, сохранить его как fdtest.c , так что открыть свой собственный программный код во время выполнения:
Скомпилируйте это:
Запустить его:
Вывод, который вы получите, будет примерно таким:
... это номер дескриптора файла, на который ссылается переменная
fd
.источник