Получение дескриптора файла в качестве аргумента

В перенаправлении bash я спросил вопрос и получил ответ следующим образом.

С cat < file, cat читает со своего стандартного ввода; оболочка открывает файл и подключает дескриптор файла к cat

Теперь мне любопытно, как это возможно. Я имею в виду, как программа (реализованная на C или C ++) получает дескриптор файла в качестве аргумента. Я знал только символы (например, char* argc[]) были возможны в качестве аргументов.

1

Решение

На самом деле он не получает его в качестве аргумента (по крайней мере, не аргумент командной строки).

Когда процесс запускается (в UNIX-подобной системе), у него открываются три стандартных потока: стандартный ввод, стандартный вывод и стандартная ошибка. Если вы ничего не перенаправляете, стандартный ввод поступит с клавиатуры, и на экран будут выведены как стандартный вывод, так и стандартная ошибка (подключенная через некоторые устройства, например, в /dev).

Когда вы перенаправляете стандартный поток (вход, выход или ошибка), оболочка открывает дескриптор этого файла, а затем выполняет манипуляции, необходимые для установки его в качестве указанного стандартного потока для дочернего объекта, например, в системе, которая использует fork, он может использовать dup2 установить свой собственный стандартный дескриптор для указанного файла, затем разветвить дочерний процесс, а затем (в родительском) восстановить его стандартный поток (это не единственный возможный способ обработать его, только одна возможность).

2

Другие решения

< символ означает, что входной поток перенаправлен с stdin в file, Программа не получает дескриптор файла в качестве аргумента, но stdin ручка заменяется на ручку file предоставляется в командной строке. Смотрите описание Перенаправление в Википедии

1

< а также file являются не аргументы.

< (и аналогично >, >>, а также | являются символы перенаправления и их поведение встроено непосредственно в bash (и другие снаряды тоже).

перенаправление означает, что вместо стандартный ввод / вывод (клавиатура и монитор) программа чтения / записи из / в файл (<, >, а также >>) или — в случае | — вывод левой программы передается как ввод в правую программу.

(Предполагается, что соответствующая программа — как cat в твоем случае — запрограммирован на чтение / запись со стандартного ввода / вывода. Для программиста это очень удобный способ, так как он / она не должен заниматься файлами и их обработчиками.)

1
По вопросам рекламы [email protected]