Все аргументы для execle()
, за исключением двух последних, являются строками - предпоследний является нулевым char *
, обозначающим конец аргументов командной строки, а последним является char **
, определяющий окружающая среда. Первый - это путь к исполняемому файлу относительно текущего каталога, если имя не начинается с косой черты /
. Второй аргумент - это название программы. Последующие аргументы являются дополнительными аргументами для программы (список заканчивается аргументом (char *)0
), а затем есть последний аргумент, который является средой для программы (завершающий e
указывает, что среда передана). Отсюда, например:
extern char **environ; // No header declares this!
execle("teste", "pink elephants", (char *)0, environ);
Вы можете использовать "teste"
или "/bin/bash"
вместо "pink elephants"
, в зависимости от ваших вкусов. Только две из трех предложенных опций имени программы являются прямыми выдумками. Если вы замените аргумент environ
на (char **)0
или эквивалентный, то программа вызывается без переменных окружения, что обычно рассматривается как злоупотребление запущенной программой (скорее как сообщение о том, что ее имя равно "pink elephants
"вместо" teste
"это злоупотребление).
Вы также можете использовать переменные:
const char *progname = "teste";
execle(progname, progname, (char *)0, environ);
Завершается использованием execlp
и только написанием execlp("./teste",NULL,NULL)
; Единственное решение, которое сработало.
Впечатляет, сколько (маленьких) проблем может быть в одной простой строке кода. Использование execlp("./teste", NULL, NULL);
сомнительно, по крайней мере, по следующим пунктам:
- Вы не предоставили исполняемой программе ее имя, которое в лучшем случае невежливо и приводит к бесполезным сообщениям об ошибках и т. Д.
- Первый NULL достаточно, если вы не собираетесь указывать имя; второй никогда не обрабатывается.
- Использование
"./teste"
означает, что p
(поиск пути) часть execlp()
никогда не выполняется; Вы могли бы также использовать execle("./teste", (char *)NULL, environ);
.
- Не исключено, что
NULL
невозможно перевести на (char *)0
в списке переменных аргументов, как в execle()
. Это не очень вероятная проблема, но #define NULL 0
является законным, и если sizeof(int) == 4
, но sizeof(char *) == 8
, то у вас могут возникнуть трудности.
Помимо: вы, вероятно, найдете функции execv*()
более полезными, чем функции execl*()
. По крайней мере, мой опыт показывает, что список аргументов переменной длины чаще всего нужен программам, которые я запускаю, чем список фиксированной длины.