В перенаправлении bash я спросил вопрос и получил ответ следующим образом.
С
cat < file
,cat
читает со своего стандартного ввода; оболочка открывает файл и подключает дескриптор файла кcat
Теперь мне любопытно, как это возможно. Я имею в виду, как программа (реализованная на C или C ++) получает дескриптор файла в качестве аргумента. Я знал только символы (например, char* argc[]
) были возможны в качестве аргументов.
На самом деле он не получает его в качестве аргумента (по крайней мере, не аргумент командной строки).
Когда процесс запускается (в UNIX-подобной системе), у него открываются три стандартных потока: стандартный ввод, стандартный вывод и стандартная ошибка. Если вы ничего не перенаправляете, стандартный ввод поступит с клавиатуры, и на экран будут выведены как стандартный вывод, так и стандартная ошибка (подключенная через некоторые устройства, например, в /dev
).
Когда вы перенаправляете стандартный поток (вход, выход или ошибка), оболочка открывает дескриптор этого файла, а затем выполняет манипуляции, необходимые для установки его в качестве указанного стандартного потока для дочернего объекта, например, в системе, которая использует fork
, он может использовать dup2
установить свой собственный стандартный дескриптор для указанного файла, затем разветвить дочерний процесс, а затем (в родительском) восстановить его стандартный поток (это не единственный возможный способ обработать его, только одна возможность).
<
символ означает, что входной поток перенаправлен с stdin
в file
, Программа не получает дескриптор файла в качестве аргумента, но stdin
ручка заменяется на ручку file
предоставляется в командной строке. Смотрите описание Перенаправление в Википедии
<
а также file
являются не аргументы.
<
(и аналогично >
, >>
, а также |
являются символы перенаправления и их поведение встроено непосредственно в bash
(и другие снаряды тоже).
перенаправление означает, что вместо стандартный ввод / вывод (клавиатура и монитор) программа чтения / записи из / в файл (<
, >
, а также >>
) или — в случае |
— вывод левой программы передается как ввод в правую программу.
(Предполагается, что соответствующая программа — как cat
в твоем случае — запрограммирован на чтение / запись со стандартного ввода / вывода. Для программиста это очень удобный способ, так как он / она не должен заниматься файлами и их обработчиками.)