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?/bin/ls
sibuk, tidak akan tahu bagaimana mengeksekusibanana
!Anda tidak harus memasukkan nama file dua kali.
Yang pertama adalah file yang sebenarnya dieksekusi.
Argumen kedua adalah apa yang seharusnya menjadi
argv[0]
proses, yaitu apa yang harus dilihat proses sebagai namanya. Misalnya, jika Anda larils
dari shell, argumen pertama adalah/bin/ls
, argumen kedua adills
.Anda dapat mengeksekusi file tertentu dan menyebutnya sesuatu yang lain melalui argumen kedua; program dapat memeriksa namanya dan berperilaku berbeda sesuai dengan namanya. Ini juga dapat dilakukan melalui tautan keras (atau tautan simbolik) tetapi cara ini memberikan lebih banyak fleksibilitas.
sumber
argv[0]
ke nama tautan.Yang bisa dibawa adalah yang
argv[0]
dapat diatur untuk apa pun (termasukNULL
). Dengan konvensi ,argv[0]
akan diatur ke path yang dapat dieksekusi dimulai sebagai (oleh proses shell ketika melakukanexecve()
).Jika
./foo
dandir/bar
dua tautan berbeda (hard atau simbolis) ke executable yang sama, maka memulai program dari shell menggunakan dua jalur akan diaturargv[0]
ke./foo
dandir/bar
, masing-masing.Fakta yang
argv[0]
bisaNULL
sering diabaikan. Kode berikut mungkin macet untukNULL
argv[0]
contoh (meskipun glibc mencetak sesuatu seperti <null> sebagai gantinyaargv[0]
):Alternatif di Linux adalah menggunakan
/proc/self/exe
untuk kasus-kasus seperti itu.sumber
./foo
dan sekalidir/bar
.argv[0]
akan berbeda untuk kedua kasus (dalam setiap kasus itu akan sama dengan jalur yang Anda gunakan).argv[0]
apa pun saat Andaexec*()
memprogramnya sendiri. Ini adalah konvensi shell untuk mengaturargv[0]
jalur yang digunakan untuk memulai program (dan lebih bijak untuk melakukan hal yang sama ketika Andaexec*()
sebuah program, karena banyak program memeriksaargv[0]
dan mengharapkannya untuk menahan jalur).