GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara fungsi keluarga exec dari panggilan sistem seperti exec dan execve?

Tidak ada exec system call -- ini biasanya digunakan untuk merujuk ke semua execXX panggilan sebagai grup. Mereka semua pada dasarnya melakukan hal yang sama:memuat program baru ke dalam proses saat ini, dan menyediakannya dengan argumen dan variabel lingkungan. Perbedaannya terletak pada bagaimana program ditemukan, bagaimana argumen ditentukan, dan dari mana lingkungan berasal.

  • Panggilan dengan v dalam nama ambil parameter array untuk menentukan argv[] deretan program baru. Akhir argumen ditunjukkan oleh elemen larik yang berisi NULL .

  • Panggilan dengan l dalam nama ambil argumen dari program baru sebagai daftar argumen panjang variabel ke fungsi itu sendiri. Akhir argumen ditunjukkan dengan (char *)NULL argumen. Anda harus selalu menyertakan tipe cast, karena NULL diizinkan menjadi konstanta bilangan bulat, dan konversi argumen default saat memanggil fungsi variadic tidak akan mengubahnya menjadi pointer.

  • Panggilan dengan e dalam nama ambil argumen tambahan (atau argumen dalam l case) untuk menyediakan lingkungan program baru; jika tidak, program mewarisi lingkungan proses saat ini. Ini disediakan dengan cara yang sama seperti argv larik:larik untuk execve() , argumen terpisah untuk execle() .

  • Panggilan dengan p dalam nama cari PATH variabel lingkungan untuk menemukan program jika tidak memiliki direktori di dalamnya (yaitu tidak mengandung / karakter). Jika tidak, nama program selalu diperlakukan sebagai jalur ke yang dapat dieksekusi.

  • FreeBSD 5.2 menambahkan varian lain:execvP (dengan huruf besar P ). Ini seperti execvp() , tetapi bukannya mendapatkan jalur pencarian dari PATH variabel lingkungan, ini adalah parameter eksplisit untuk fungsi:

int execvP(const char *file, const char *search_path, char *const argv[]);

Gunakan man exec dan baca:

The execv(), execvp(), and execvpe() functions provide an array of pointers to 
null-terminated strings that represent the argument list available to the new program. 
The first argument, by convention, should point to the filename associated with the file 
being executed. The array of pointers must be terminated by a NULL pointer. 

execv

int execv(const char *path, char *const argv[]);

Jadi, Anda meneruskan larik sebagai parameter

int execle(const char *path, const char *arg,
              ..., char * const envp[]);

Hampir sama, tetapi bukan sebagai larik, melainkan sebagai daftar nilai (string), diikuti oleh larik yang menunjukkan lingkungan.

Di sini:

int execvp(const char *file, char *const argv[]);

Anda memanggil file, tanpa jalur, jadi diharapkan Anda sudah berada di path yang benar sebelum menelepon.

Terakhir namun tidak kalah pentingnya:

int execve(const char *filename, char *const argv[],
                  char *const envp[]);

Mirip dengan yang sebelumnya, tetapi sekarang Anda memiliki dua larik, untuk argumen dan variabel lingkungan.


Karena semua fungsi ini milik keluarga exec(), izinkan saya differentiate menurut extra characters dengan artinya,

1.execve ():

p :not present => nama program yang akan dijalankan diambil dari pathname

v :present => argumen akan diteruskan sebagai array

e :present => environment akan diambil dari envp argument

2.execfile ():

p :not present => nama program yang akan dijalankan diambil dari pathname

l :present => argumen akan diteruskan sebagai list

e :present => environment akan diambil dari envp argument

3.execlp ():

p :present => nama program yang akan dijalankan diambil dari filename ditentukan atau sistem akan search for program file di PATH variabel.

l :present => argumen akan diteruskan sebagai list

e :not present => environment akan diambil dari caller's environ

4.execvp ():

p :present => nama program yang akan dijalankan diambil dari filename ditentukan atau sistem akan search for program file di PATH variabel.

v :present => argumen akan diteruskan sebagai array

e :not present => environment akan diambil dari caller's environ

5.execv ():

p :not present => nama program yang akan dijalankan diambil dari pathname

v :present => argumen akan diteruskan sebagai array

e :not present => environment akan diambil dari caller's environ

6.execl ():

p :not present => nama program yang akan dijalankan diambil dari pathname

l :present => argumen akan diteruskan sebagai list

e :not present => environment akan diambil dari caller's environ


Linux
  1. Perbedaan antara panggilan sistem statvfs() dan statfs()?

  2. Apa perbedaan antara fsck dan e2fsck?

  3. Apa perbedaan antara adduser dan useradd?

  1. Apa perbedaan antara procfs dan sysfs?

  2. Apa perbedaan antara ls dan l?

  3. Apa perbedaan antara panggilan yang mungkin dan tidak mungkin di Kernel?

  1. Apa perbedaan antara InnoDB dan MyISAM?

  2. Apa perbedaan antara strtok_r dan strtok_s di C?

  3. Apa perbedaan antara $(CC) dan $CC?