Семейство функций exec
в конечном счете является системным вызовом. Системные вызовы поступают прямо в ядро и обычно выполняют очень специфические функции, которые может выполнять только ядро.
С другой стороны, перенаправление — это функция оболочки.
Таким образом, когда кто-то вводит ls > awd.txt
в оболочке, оболочка сначала выполняет fork(2)
, затем закрывает стандартный вывод в дочернем элементе, затем открывает awd.txt
в файловом дескрипторе номер один, так что это новый стандартный вывод.
Тогда и только тогда оболочка выполнит системный вызов exec-
family.
В вашем случае вы просто передали строки >
и awd.txt
в системный вызов exec, а оттуда в ls
. Кстати, убедитесь, что вы завершаете массив execvp arg нулевым указателем.
Примечание. Как видите, операторы перенаправления никогда не видны исполняемой программе. До Unix направление вывода в файл должно было выполняться каждой программой на основе параметра. Еще одна мелочь: большинство программ никогда не узнают, что они были перенаправлены, но, по иронии судьбы, ls
делает проверку, чтобы увидеть, является ли его вывод tty, и если это так, он выполняет форматирование вывода с несколькими столбцами.
person
DigitalRoss
schedule
27.01.2013