Здесь мы должны дважды передать имя файла в функции.
Они не совсем то же самое, что вы заметили, заметив, что один из них используется в качестве argv[0]
значения. Это не должно совпадать с базовым именем исполняемого файла; многие / большинство вещей игнорируют это, и вы можете положить туда все, что захотите.
Первый - это фактический путь к исполняемому файлу, для которого есть очевидная необходимость. Второй передается процессу якобы как имя, используемое для его вызова, но, например:
execl("/bin/ls", "banana", "-l", NULL);
Будет работать нормально, если предположить, что /bin/ls
это правильный путь.
Некоторые приложения, однако, используют argv[0]
. Обычно они имеют одну или несколько символических ссылок $PATH
; это распространено в утилитах сжатия (иногда они используют оболочки оболочки). Если вы xz
установили, stat $(which xzcat)
показывает, что это ссылка xz
, и man xzcat
это то же самое, man xz
что объясняет, что «xzcat эквивалентен xz --decompress --stdout». Способ, которым xz может сказать, как он был вызван, - проверка argv[0]
, делающая эти эквиваленты:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
может быть то, что вы хотите, чтобы это было в зависимости от того, как вы это называете правильно?