Jadi di sini kita harus melewati nama file dua kali dalam fungsinya.
Mereka tidak persis sama dengan yang Anda perhatikan dengan mengamati bahwa salah satunya digunakan sebagai argv[0]
nilainya. Ini tidak harus sama dengan nama dasar dari executable; banyak hal mengabaikannya dan Anda dapat meletakkan apa pun yang Anda inginkan di sana.
Yang pertama adalah jalan aktual ke executable, yang ada kebutuhan jelas. Yang kedua diteruskan ke proses seolah-olah sebagai nama yang digunakan untuk memintanya, tetapi, misalnya:
execl("/bin/ls", "banana", "-l", NULL);
Akan bekerja dengan baik, anggaplah /bin/ls
jalan yang benar.
Namun, beberapa aplikasi memanfaatkan argv[0]
. Biasanya ini memiliki satu atau lebih symlink di $PATH
; ini biasa terjadi pada utilitas kompresi (terkadang mereka menggunakan pembungkus shell sebagai gantinya). Jika Anda telah xz
menginstal, stat $(which xzcat)
menunjukkan tautannya xz
, dan man xzcat
sama dengan man xz
yang menjelaskan "xzcat setara dengan xz --decompress --stdout". Cara xz dapat mengetahui bagaimana itu dipanggil adalah dengan memeriksa argv[0]
, membuat ini setara:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
bisa menjadi apa yang Anda inginkan tergantung pada bagaimana Anda menyebutnya benar?