Panggilan Sistem

Panggilan Sistem Linux Exec

Panggilan Sistem Linux Exec

Panggilan sistem exec digunakan untuk mengeksekusi file yang berada dalam proses aktif. Ketika exec dipanggil, file yang dapat dieksekusi sebelumnya diganti dan file baru dieksekusi.

Lebih tepatnya, kita dapat mengatakan bahwa menggunakan exec system call akan menggantikan file atau program lama dari proses dengan file atau program baru. Seluruh isi proses diganti dengan program baru.

Segmen data pengguna yang mengeksekusi panggilan sistem exec() diganti dengan file data yang namanya diberikan dalam argumen saat memanggil exec().

Program baru dimuat ke dalam ruang proses yang sama. Proses saat ini baru saja berubah menjadi proses baru dan karenanya id proses PID tidak berubah, ini karena kami tidak membuat proses baru kami hanya mengganti proses dengan proses lain di exec.

Jika proses yang sedang berjalan berisi lebih dari satu utas maka semua utas akan dihentikan dan gambar proses baru akan dimuat dan kemudian dieksekusi. Tidak ada fungsi destruktor yang menghentikan utas proses saat ini.

PID proses tidak diubah tetapi data, kode, tumpukan, tumpukan, dll. proses diubah dan diganti dengan proses yang baru dimuat loaded. Proses baru dijalankan dari titik masuk.

Panggilan sistem Exec adalah kumpulan fungsi dan dalam bahasa pemrograman C, nama standar untuk fungsi-fungsi ini adalah sebagai berikut:

  1. execl
  2. pelaksana
  3. execlp
  4. eksekutif
  5. eksekutif
  6. execvp


Perlu dicatat di sini bahwa fungsi-fungsi ini memiliki basis yang sama eksekutif diikuti oleh satu atau lebih huruf. Ini dijelaskan di bawah ini:

e: Ini adalah array pointer yang menunjuk ke variabel lingkungan dan diteruskan secara eksplisit ke proses yang baru dimuat.

aku: l adalah untuk argumen baris perintah yang meneruskan daftar ke fungsi

hal: p adalah variabel lingkungan jalur yang membantu menemukan file yang diteruskan sebagai argumen untuk dimuat ke dalam proses.

v: v adalah untuk argumen baris perintah. Ini diteruskan sebagai array pointer ke fungsi.

Mengapa exec digunakan?

exec digunakan ketika pengguna ingin meluncurkan file atau program baru dalam proses yang sama.

Kerja dalam dari eksekutif

Pertimbangkan poin-poin berikut untuk memahami cara kerja exec:

  1. Gambar proses saat ini ditimpa dengan gambar proses baru.
  2. Gambar proses baru adalah yang Anda berikan sebagai argumen execec
  3. Proses yang sedang berjalan telah berakhir
  4. Gambar proses baru memiliki ID proses yang sama, lingkungan yang sama, dan deskriptor file yang sama (karena proses tidak diganti gambar proses diganti)
  5. Stat CPU dan memori virtual terpengaruh. Pemetaan memori virtual dari gambar proses saat ini digantikan oleh memori virtual dari gambar proses baru.

Sintaks fungsi keluarga exec:

Berikut ini adalah sintaks untuk setiap fungsi exec:

int execl(const char* path, const char* arg,… )
int execlp(const char* file, const char* arg,… )
int execle(const char* path, const char* arg,… , char* const envp[])
int execv(const char* path, const char* argv[])
int execvp(const char* file, const char* argv[])
int execvpe(file const char*, const char* argv[], char *const envp[])

Deskripsi:

Tipe kembalian dari fungsi-fungsi ini adalah Int. Ketika gambar proses berhasil diganti, tidak ada yang dikembalikan ke fungsi pemanggilan karena proses yang memanggilnya tidak lagi berjalan. Tetapi jika ada kesalahan -1 akan dikembalikan. Jika terjadi kesalahan dan salah sudah diatur.

Dalam sintaks:

  1. jalan digunakan untuk menentukan nama path lengkap dari file yang akan dieksekusi.
  1. argumen apakah argumennya lolos?. Ini sebenarnya nama file yang akan dieksekusi dalam proses. Seringkali nilai arg dan path sama path.
  1. const char* arg dalam fungsi execl(), execlp() dan execle() dianggap sebagai arg0, arg1, arg2,… ​​, argn. Ini pada dasarnya adalah daftar pointer ke string yang diakhiri null. Di sini argumen pertama menunjuk ke nama file yang akan dieksekusi seperti yang dijelaskan pada poin 2.
  1. envp adalah array yang berisi pointer yang menunjuk ke variabel lingkungan.
  1. mengajukan digunakan untuk menentukan nama jalur yang akan mengidentifikasi jalur file gambar proses baru.
  1. Fungsi panggilan exec yang diakhiri dengan e digunakan untuk mengubah lingkungan untuk gambar proses baru. Fungsi-fungsi ini melewati daftar pengaturan lingkungan dengan menggunakan argumen envp. Argumen ini adalah larik karakter yang menunjuk ke String yang diakhiri null dan mendefinisikan variabel lingkungan.

Untuk menggunakan fungsi keluarga exec, Anda perlu menyertakan file header berikut dalam program C Anda:

#termasuk

Contoh 1: Menggunakan panggilan sistem exec dalam program C

Pertimbangkan contoh berikut di mana kami telah menggunakan panggilan sistem exec dalam pemrograman C di Linux, Ubuntu: Kami memiliki dua file c di sini contoh.c dan halo.c:

contoh.c

KODE:

#termasuk
#termasuk
#termasuk
int main(int argc, char *argv[])

printf("PID contoh.c = %d\n", getpid());
char *args[] = "Halo", "C", "Pemrograman", NULL;
eksekutif("./halo", args);
printf("Kembali ke contoh.c");
kembali 0;

Halo.c

KODE:

#termasuk
#termasuk
#termasuk
int main(int argc, char *argv[])

printf("Kami dalam Halo.c\n");
printf("PID halo.c = %d\n", getpid());
kembali 0;

KELUARAN:

Contoh PID.c = 4733
Kami di Halo.c
PID halo.c = 4733

Dalam contoh di atas kita memiliki contoh.file c dan halo.file c. Dalam contoh .c file pertama-tama kami telah mencetak ID dari proses saat ini (contoh file.c sedang berjalan dalam proses saat ini). Kemudian di baris berikutnya kita telah membuat array pointer karakter. Elemen terakhir dari array ini harus NULL sebagai titik terminasi.

Kemudian kita telah menggunakan fungsi execv() yang mengambil nama file dan array penunjuk karakter sebagai argumennya. Perlu dicatat di sini bahwa kami telah menggunakan ./ dengan nama file, itu menentukan jalur file. Karena file ada di folder tempat contoh.c berada sehingga tidak perlu menentukan path lengkap.

Ketika fungsi execv() dipanggil, gambar proses kami akan diganti sekarang contoh file.c tidak dalam proses tetapi file halo.c sedang dalam proses. Dapat dilihat bahwa ID prosesnya sama apakah halo.c adalah gambar proses atau contoh.c adalah gambar proses karena prosesnya sama dan gambar proses hanya diganti.

Kemudian kita memiliki hal lain yang perlu diperhatikan di sini yaitu pernyataan printf() setelah execv() tidak dieksekusi. Ini karena kontrol tidak pernah dikembalikan ke gambar proses lama setelah gambar proses baru menggantikannya. Kontrol hanya kembali ke fungsi panggilan saat mengganti gambar proses tidak berhasil. (Nilai pengembaliannya adalah -1 dalam kasus ini).

Perbedaan antara panggilan sistem fork() dan exec():

Panggilan sistem fork() digunakan untuk membuat salinan persis dari proses yang sedang berjalan dan salinan yang dibuat adalah proses anak dan proses yang berjalan adalah proses induk. Sedangkan, panggilan sistem exec() digunakan untuk mengganti gambar proses dengan gambar proses baru. Karenanya tidak ada konsep proses induk dan anak dalam panggilan sistem exec()().

Dalam panggilan sistem fork(), proses induk dan anak dieksekusi secara bersamaan. Tetapi dalam panggilan sistem exec(), jika penggantian gambar proses berhasil, kontrol tidak kembali ke tempat fungsi exec dipanggil melainkan akan menjalankan proses baru. Kontrol hanya akan ditransfer kembali jika ada kesalahan.

Contoh 2: Menggabungkan panggilan sistem fork() dan exec()

Pertimbangkan contoh berikut di mana kita telah menggunakan panggilan sistem fork() dan exec() dalam program yang sama:

contoh.c

KODE:

#termasuk
#termasuk
#termasuk
int main(int argc, char *argv[])

printf("PID contoh.c = %d\n", getpid());
pid_t p;
p = garpu();
jika(p==-1)

printf("Ada kesalahan saat memanggil fork()");

jika(p==0)

printf("Kami sedang dalam proses anak\n");
printf("Memanggil Halo.c dari proses anak\n");
char *args[] = "Halo", "C", "Pemrograman", NULL;
eksekutif("./halo", args);

lain

printf("Kami sedang dalam proses induk");

kembali 0;

Halo.c:

KODE:

#termasuk
#termasuk
#termasuk
int main(int argc, char *argv[])

printf("Kami dalam Halo.c\n");
printf("PID halo.c = %d\n", getpid());
kembali 0;

KELUARAN:

Contoh PID.c = 4790
Kami sedang dalam Proses Induk
Kami sedang dalam Proses Anak
Memanggil halo.c dari proses anak
Kami berada di halo.c
PID halo.c = 4791

Dalam contoh ini kita telah menggunakan fork() system call. Ketika proses anak dibuat 0 akan ditugaskan ke p dan kemudian kita akan pindah ke proses anak child. Sekarang blok pernyataan dengan if(p==0) akan dieksekusi. Sebuah pesan ditampilkan dan kami telah menggunakan panggilan sistem execv() dan gambar proses anak saat ini yang merupakan contoh.c akan diganti dengan halo.c. Sebelum execv() memanggil proses anak dan orang tua adalah sama.

Dapat dilihat bahwa PID contoh.c dan halo.c berbeda sekarang. Ini karena contoh.c adalah gambar proses induk dan halo.c adalah gambar proses anak.

Tutorial OpenTTD
OpenTTD adalah salah satu game simulasi bisnis paling populer di luar sana. Dalam game ini, Anda perlu membuat bisnis transportasi yang luar biasa. Na...
SuperTuxKart untuk Linux
SuperTuxKart adalah judul hebat yang dirancang untuk memberi Anda pengalaman Mario Kart gratis di sistem Linux Anda. Ini cukup menantang dan menyenang...
Pertempuran untuk Tutorial Westnoth
The Battle for Wesnoth adalah salah satu game strategi open source terpopuler yang bisa kamu mainkan saat ini. Tidak hanya game ini telah dikembangkan...