Использование execl (Аргументы) - PullRequest
0 голосов
/ 11 ноября 2018

новичок в C. Итак, у меня есть программа с именем test.c (для запуска не нужны никакие аргументы, скомпилированные так " gcc test.c -o test ") Я хочу, чтобы моя другая программа выполнила тест Я знаю, что должен использовать execl, но я просто не могу понять аргументы в функции execl

execl (код здесь)

1 Ответ

0 голосов
/ 11 ноября 2018

Все аргументы для 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); сомнительно, по крайней мере, по следующим пунктам:

  1. Вы не предоставили исполняемой программе ее имя, которое в лучшем случае невежливо и приводит к бесполезным сообщениям об ошибках и т. Д.
  2. Первый NULL достаточно, если вы не собираетесь указывать имя; второй никогда не обрабатывается.
  3. Использование "./teste" означает, что p (поиск пути) часть execlp() никогда не выполняется; Вы могли бы также использовать execle("./teste", (char *)NULL, environ);.
  4. Не исключено, что NULL невозможно перевести на (char *)0 в списке переменных аргументов, как в execle(). Это не очень вероятная проблема, но #define NULL 0 является законным, и если sizeof(int) == 4, но sizeof(char *) == 8, то у вас могут возникнуть трудности.

Помимо: вы, вероятно, найдете функции execv*() более полезными, чем функции execl*(). По крайней мере, мой опыт показывает, что список аргументов переменной длины чаще всего нужен программам, которые я запускаю, чем список фиксированной длины.

...