GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Kita Harus Melewati Nama File Dua Kali Dalam Fungsi Exec?

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);

Linux
  1. menggunakan linux bagaimana saya bisa meneruskan konten file sebagai parameter ke yang dapat dieksekusi?

  2. lulus stdout sebagai nama file untuk utilitas baris perintah?

  3. Di mana file header <conio.h> di Linux? Mengapa saya tidak dapat menemukan <conio.h>?

  1. Mengapa Pc Membeku Saat Saya Menyalin File Ke Flashdisk?

  2. temukan file yang memiliki nomor dalam nama file lebih besar dari

  3. Mengapa sistem operasi memiliki batas ukuran file?

  1. Basa'?

  2. Linux – Mengapa Tidak Ada Sistem File Rootfs Di Sistem?

  3. Bagaimana Melewati Isi File Sebagai Parameter Baris Perintah?