Отже, тут ми повинні передати ім'я файлу двічі у функції.
Вони не зовсім те саме, що ви помічаєте, спостерігаючи, що один із них використовується як 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
може бути те, що ви хочете, щоб це було залежно від того, як ви це правильно називаєте?