Как перенаправить вывод 'ls' (или любой другой команды оболочки) в канал?

0

Моя задача - сделать программу на C, которая открывает канал, затем один из процессов "выполняет команду ls и записывает вывод в трубу. Затем другой процесс должен прочитать его и отобразить в оболочке.

Итак, главная проблема, с которой я борюсь, заключается в следующем:

execl("/bin/ls", "/bin/ls", NULL);

Как я могу перенаправить вывод в трубу?

Другим способом, который я пытался сделать, было перенаправить вывод в файл, прочитать файл, а затем записать его в канал, а затем, наконец, прочитать его на другом конце (и удалить файл). В оболочке, которая бы хотела:

ls > ls_out.txt

Но я не смог воспроизвести это с помощью execl.

Конечно, моим любимым решением остается что-то вроде:

execl("/bin/ls", "bin/ls", " > my_pipe", NULL)
Теги:

4 ответа

1
Лучший ответ

Создайте канал в своей программе.

Сделайте вилку.

В дочернем процессе сделайте запись конца трубы новым STDOUT_FILENO. (Читайте о системном вызове dup2)

Выполните программу, которую хотите запустить.

В родительском процессе считывается из считывающего конца трубы.

Так, например, popen работает под капотом.

2

Используйте функцию popen() вместо execl() для чтения вывода приложения, см. Http://linux.die.net/man/3/popen

0

Вы, похоже, много внимания exec(); этот вызов предназначен для запуска процесса. Труба должна быть настроена заранее, так как процесс, который вы собираетесь запустить, будет использовать только то, что stdin/stdout уже существует. См. fork(), dup() и pipe() для примитивов низкого уровня.

0

Я думаю, это может быть то, что вы ищете?

для я в ls -1; echo $ i; сделанный

или

ls -1 | xargs echo

?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню