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