Кажется, мне что-то не хватает в этих функциях exec *.
Первый аргумент - это имя файла или путь к исполняемому файлу.
Второй аргумент (когда l) или первый элемент второго аргумента (когда v) тоже нечто подобное. Например, здесь.
Неужели нам действительно нужно многократно дублировать избыточность? Спасибо.
и unix.stackexchange.com/questions/484734/…





Часто у них есть одна и та же информация, но она не лишняя. Первое - это имя исполняемого файла, а второе - это то, что исполняемый файл видит как имя. Например, BusyBox использует ссылки для предоставления различных функций в зависимости от имени, под которым вызывается исполняемый файл. Поэтому иногда вы хотите дать вызываемому двоичному файлу имя, отличное от имени на диске.
Спасибо. не могли бы вы уточнить, что «BusyBox использует ссылки для обеспечения различных функций в зависимости от имени, под которым вызывается исполняемый файл»?
@Tim BusyBox - это своего рода «все инструменты оболочки в одном двоичном файле». На диске есть только один исполняемый файл, а такие инструменты, как ls, cp и т. д., Являются ссылками на этот двоичный файл. Когда он запускается командой ls, двоичный файл может проверить из списка аргументов, что он был запущен как ls, и должен ли обеспечивать эту функциональность. Когда он работает как cp, он будет работать как cp. Таким образом, независимо от фактического двоичного файла исполняемая программа может иметь другое «имя» в зависимости от того, как она выполнялась.
По соглашению первым аргументом программы (например, argv[0]) является имя выполняемой программы, но это не обязательно.
Например:
execl("/bin/ls", "ls", "-l", (void *)NULL);
В этом случае запускаемая программа - это полный путь к исполняемому файлу, а первый аргумент - это просто имя исполняемого файла без пути.
Спасибо. Из любопытства, является ли execl() вашим фаворитом из семейства exec * в случаях, когда применимы несколько из них?
Вы можете указать все, что хотите, в качестве аргумента (второй аргумент). Даже «ничего» (arg = [NULL]).
Единственный эффект, который это будет иметь, - это то, что вызываемая программа будет иметь в качестве argv именно то, что вы даете ей через arg.
Однако некоторые программы ожидают, что всегда будет иметь argv [0], и не проверяют, является ли argv [0] NULL или нет. Если вы ничего не дадите, вы можете сломать вызванную программу.
Кроме этого, это не должно вызывать никаких проблем, если какая-либо вменяемая программа проверит его аргумент.
Если вы чувствуете, что никогда не захотите, чтобы первый член массива отличался от первого аргумента, вы всегда можете обернуть функцию, чтобы избежать повторения:
int my_execvp(char const *argv) { return execvp(argv[0],argv); }
Спасибо. execvp - единственный из семейства exec *, к которому можно применить обходной путь? ( Я думаю да)
Я только что нашел unix.stackexchange.com/questions/315812/…