Моя задача - сделать программу на C, которая открывает канал, затем один из процессов "выполняет команду ls и записывает вывод в трубу. Затем другой процесс должен прочитать его и отобразить в оболочке.
Итак, главная проблема, с которой я борюсь, заключается в следующем:
execl("/bin/ls", "/bin/ls", NULL);
Как я могу перенаправить вывод в трубу?
Другим способом, который я пытался сделать, было перенаправить вывод в файл, прочитать файл, а затем записать его в канал, а затем, наконец, прочитать его на другом конце (и удалить файл). В оболочке, которая бы хотела:
ls > ls_out.txt
Но я не смог воспроизвести это с помощью execl
.
Конечно, моим любимым решением остается что-то вроде:
execl("/bin/ls", "bin/ls", " > my_pipe", NULL)
Создайте канал в своей программе.
Сделайте вилку.
В дочернем процессе сделайте запись конца трубы новым STDOUT_FILENO
. (Читайте о системном вызове dup2
)
Выполните программу, которую хотите запустить.
В родительском процессе считывается из считывающего конца трубы.
Так, например, popen
работает под капотом.
Используйте функцию popen() вместо execl() для чтения вывода приложения, см. Http://linux.die.net/man/3/popen
Вы, похоже, много внимания exec()
; этот вызов предназначен для запуска процесса. Труба должна быть настроена заранее, так как процесс, который вы собираетесь запустить, будет использовать только то, что stdin/stdout уже существует. См. fork()
, dup()
и pipe()
для примитивов низкого уровня.
Я думаю, это может быть то, что вы ищете?
для я в ls -1
; echo $ i; сделанный
или
ls -1 | xargs echo
?