Содержат ли первые два аргумента в функциях exec * избыточную информацию?

Кажется, мне что-то не хватает в этих функциях exec *.

Первый аргумент - это имя файла или путь к исполняемому файлу.

Второй аргумент (когда l) или первый элемент второго аргумента (когда v) тоже нечто подобное. Например, здесь.

Неужели нам действительно нужно многократно дублировать избыточность? Спасибо.

Я только что нашел unix.stackexchange.com/questions/315812/…

Tim 28.11.2018 20:49

и unix.stackexchange.com/questions/484734/…

Tim 28.11.2018 21:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
182
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Часто у них есть одна и та же информация, но она не лишняя. Первое - это имя исполняемого файла, а второе - это то, что исполняемый файл видит как имя. Например, BusyBox использует ссылки для предоставления различных функций в зависимости от имени, под которым вызывается исполняемый файл. Поэтому иногда вы хотите дать вызываемому двоичному файлу имя, отличное от имени на диске.

Спасибо. не могли бы вы уточнить, что «BusyBox использует ссылки для обеспечения различных функций в зависимости от имени, под которым вызывается исполняемый файл»?

Tim 28.11.2018 17:41

@Tim BusyBox - это своего рода «все инструменты оболочки в одном двоичном файле». На диске есть только один исполняемый файл, а такие инструменты, как ls, cp и т. д., Являются ссылками на этот двоичный файл. Когда он запускается командой ls, двоичный файл может проверить из списка аргументов, что он был запущен как ls, и должен ли обеспечивать эту функциональность. Когда он работает как cp, он будет работать как cp. Таким образом, независимо от фактического двоичного файла исполняемая программа может иметь другое «имя» в зависимости от того, как она выполнялась.

Sami Kuhmonen 28.11.2018 17:51

По соглашению первым аргументом программы (например, argv[0]) является имя выполняемой программы, но это не обязательно.

Например:

execl("/bin/ls", "ls", "-l", (void *)NULL);

В этом случае запускаемая программа - это полный путь к исполняемому файлу, а первый аргумент - это просто имя исполняемого файла без пути.

Спасибо. Из любопытства, является ли execl() вашим фаворитом из семейства exec * в случаях, когда применимы несколько из них?

Tim 29.11.2018 01:09

Вы можете указать все, что хотите, в качестве аргумента (второй аргумент). Даже «ничего» (arg = [NULL]).

Единственный эффект, который это будет иметь, - это то, что вызываемая программа будет иметь в качестве argv именно то, что вы даете ей через arg.

Однако некоторые программы ожидают, что всегда будет иметь argv [0], и не проверяют, является ли argv [0] NULL или нет. Если вы ничего не дадите, вы можете сломать вызванную программу.

Кроме этого, это не должно вызывать никаких проблем, если какая-либо вменяемая программа проверит его аргумент.

Если вы чувствуете, что никогда не захотите, чтобы первый член массива отличался от первого аргумента, вы всегда можете обернуть функцию, чтобы избежать повторения:

int my_execvp(char const *argv) { return execvp(argv[0],argv); }

Спасибо. execvp - единственный из семейства exec *, к которому можно применить обходной путь? ( Я думаю да)

Tim 29.11.2018 01:11

Другие вопросы по теме