Saya membaca Pemrograman Lanjutan di Lingkungan UNIX oleh Stevens, 8 bab.
Saya membaca dan memahami keenam fungsi eksekutif.
Satu hal yang saya perhatikan adalah, di semua fungsi exec:
- argumen pertama adalah nama file / nama path (tergantung pada fungsi exec).
- argumen kedua adalah argv[0] yang kita dapatkan di
main()
, yang merupakan nama file itu sendiri.
Jadi di sini kita harus memasukkan nama file dua kali dalam fungsi.
Apakah ada alasan untuk itu (seperti kita tidak bisa mendapatkan nama file dari nama path dari argumen pertama)?
Jawaban yang Diterima:
Jadi di sini kita harus memasukkan nama file dua kali dalam fungsi.
Mereka tidak sama persis seperti yang Anda perhatikan dengan mengamati satu di antaranya digunakan sebagai argv[0]
nilai. Ini tidak harus sama dengan nama dasar dari executable; banyak/sebagian besar mengabaikannya dan Anda dapat meletakkan apa pun yang Anda inginkan di sana.
Yang pertama adalah jalur aktual ke yang dapat dieksekusi, yang jelas merupakan kebutuhan. Yang kedua diteruskan ke proses seolah-olah sebagai nama yang digunakan untuk memanggilnya, tetapi, misalnya:
execl("/bin/ls", "banana", "-l", NULL);
Akan berfungsi dengan baik, dengan asumsi /bin/ls
adalah jalan yang benar.
Namun, beberapa aplikasi menggunakan argv[0]
. Biasanya ini memiliki satu atau lebih symlink di $PATH
; ini biasa terjadi pada utilitas kompresi (kadang-kadang mereka menggunakan pembungkus shell). Jika Anda memiliki xz
diinstal, stat $(which xzcat)
menunjukkan itu tautan ke xz
, dan man xzcat
sama dengan man xz
yang menjelaskan “xzcat setara dengan xz –dekompresi –stdout”. Cara xz mengetahui bagaimana ia dipanggil adalah dengan mencentang argv[0]
, membuat ini setara:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);