execlp несколько "программ" - PullRequest
2 голосов
/ 11 января 2012

Я хочу запустить что-то вроде

cat file.tar | base64 | myprogram -c "| base64 -d | tar -zvt "

Я использую execlp для запуска процесса.

Когда я пытаюсь запустить что-то вроде cat, это работает, но если япопробуйте запустить base64 -d | tar -zvt, это не работает.

Я посмотрел на команды bash и обнаружил, что могу запустить bash и сказать ему, чтобы он запускал другие программы.Так что это что-то вроде:

execlp ("bash", "-c", "base64 -d | tar -zvt", NULL);

Если я запускаю его на терминале, он работает хорошо, но с использованием execlp он не работает.Если я использую execlp("cat", "cat", NULL), это работает.

Кто-то знает, как использовать параметр -c в execlp для выполнения нескольких "программ"?Я не могу использовать систему, потому что я использую pipe и fork.

Теперь я заметил, что если я пытаюсь использовать execlp ("bash", "bash", "-c", "base64", NULL) ...Ничего не произошло.Если я использую execlp ("cat", NULL), все в порядке ... Я пишу в стандартный ввод ... Я не знаю, в чем проблема с bash -c base64 .. потому что, если я запускаю на терминале echo"ASD" |bash -c "кошка", она идет хорошо

1 Ответ

4 голосов
/ 11 января 2012

Первый «аргумент» - это то, что становится argv[0], поэтому вы должны вызывать что-то вроде:

execlp("bash", "bash", "-c", "base64 -d | tar -zvt", NULL);

Редактировать Небольшое объяснение того, что делает вышеуказанная функция: семейство функций exec выполняет программу. В приведенном выше вызове рассматриваемая программа называется bash (первый аргумент). Bash, как и все другие программы, имеет функцию main, которая является отправной точкой программы. И, как и все другие функции main, функция в Bash получает два аргумента, обычно называемые argc и argv. argv - это массив строк с нулевым символом в конце, а argc - это количество записей в массиве argv. argc всегда будет по крайней мере 1, что означает, что всегда есть одна запись в argv[0]. Эта первая запись представляет собой «имя» программы, чаще всего путь к файлу программы. Все остальные программные аргументы в командной строке помещаются в argv[1] до argv[argc - 1].

Что делает execlp, так это использует первый аргумент для поиска программы, которую нужно выполнить, а все остальные аргументы будут помещены в массив программ argv в том порядке, в котором они заданы. Это означает, что приведенный выше вызов execlp вызовет программу "bash" и установит для массива argv Bash следующее:

argv[0] = "bash"
argv[1] = "-c"
argv[2] = "base64 -d | tar -zvt"

Также для argc Bash будет установлено значение 3.

Если второе "bash" будет изменено на "foo", то для argv[0] Bash также будет установлено значение "foo".

Надеюсь, это немного прояснит.

...