GNU/Linux >> Belajar Linux >  >> Linux

Pelajari dan gunakan panggilan sistem fork(), vfork(), wait() dan exec() di seluruh Sistem Linux

Ditemukan bahwa dalam Sistem Operasi berbasis Linux/Unix, memahami fork . adalah hal yang baik dan vfork panggilan sistem, bagaimana mereka berperilaku, bagaimana kita dapat menggunakannya dan perbedaan di antara mereka. Bersamaan dengan ini tunggu dan exec panggilan sistem digunakan  untuk pemijahan proses dan berbagai tugas terkait lainnya.

Sebagian besar konsep ini dijelaskan menggunakan contoh pemrograman. Dalam artikel ini, saya akan membahas apa itu panggilan sistem fork, vfork, exec, dan wait, karakter yang membedakannya, dan cara menggunakannya dengan lebih baik.

garpu()

garpu(): Panggilan sistem untuk membuat proses anak.

[email protected] ~}$ man fork

Ini akan menghasilkan keluaran yang menyebutkan untuk apa garpu digunakan, sintaksis, dan bersama dengan semua detail yang diperlukan.

Sintaks yang digunakan untuk fork system call adalah seperti di bawah ini,

garpu pid_t(void);

Panggilan sistem garpu membuat anak yang berbeda dari proses induknya hanya di pid(ID proses) dan ppid(ID proses induk) . Pemanfaatan sumber daya diatur ke nol. Kunci file dan sinyal tertunda tidak diwariskan. (Di Linux “fork” diimplementasikan sebagai “copy-on-write() “).

Catatan:-Salin saat menulis ” -> Setiap kali panggilan sistem fork() dipanggil, salinan semua halaman (memori) yang terkait dengan proses induk dibuat dan dimuat ke lokasi memori terpisah oleh Sistem Operasi untuk proses anak. Tetapi ini tidak diperlukan dalam semua kasus dan mungkin diperlukan hanya ketika beberapa proses menulis ke ruang alamat atau area memori ini, maka hanya salinan terpisah yang dibuat/disediakan.

Mengembalikan nilai :-  PID (ID proses) dari proses anak dikembalikan di utas eksekusi induk dan “nol ” dikembalikan di utas eksekusi anak. Berikut adalah contoh c-programming yang menjelaskan cara kerja fork system call.

[email protected] ~}$ vim 1_fork.c#include#includeInt main(void){printf("Sebelum fork\n");fork();printf( "after fork\n");}[email protected] ~}$ [email protected] ~}$ cc 1_fork.c[email protected] ~}$ ./a.outBefore forkAfter fork[email protected] ~}$ 

Setiap kali panggilan sistem dilakukan, ada banyak hal yang terjadi di balik layar di mesin unix/linux mana pun.

Pertama-tama, peralihan konteks terjadi dari mode pengguna ke mode kernel (sistem). Ini didasarkan pada prioritas proses dan sistem operasi unix/linux yang kami gunakan. Dalam kode contoh C di atas kita menggunakan kurung kurawal pembuka “{” yang merupakan entri konteks dan kurung kurawal penutup “}” untuk keluar dari konteks. Tabel berikut menjelaskan peralihan konteks dengan sangat jelas.

vfork()

vfork –> buat proses anak dan blokir proses induk.

Catatan:- Di vfork, penangan sinyal diwariskan tetapi tidak dibagikan.

[email protected] ~}$ man vfork

Ini akan menghasilkan keluaran yang menyebutkan untuk apa vfork digunakan, sintaksis, dan bersama dengan semua detail yang diperlukan.

pid_t vfork(void);

vfork sama dengan fork kecuali bahwa perilaku tidak terdefinisi jika proses yang dibuat oleh vfork baik memodifikasi data apa pun selain variabel bertipe pid_t yang digunakan untuk menyimpan nilai kembalian p dari vfork atau memanggil fungsi lain apa pun antara memanggil _exit() atau salah satu dari eksekutif () keluarga.

Catatan: vfork kadang-kadang disebut sebagai kasus klon khusus.

Berikut ini adalah contoh pemrograman C untuk vfork() cara kerjanya.

[email protected] ~}$ vim 1.vfork.c#include#includeInt main(void){printf("Sebelum fork\n");vfork(); printf("after fork\n");}[email protected] ~}$ vim 1.vfork.c[email protected] ~}$ cc 1.vfork.c[email protected] ~}$ ./a.outBefore vforkafter vforkafter vforka.out:cxa_atexit.c:100:__new_exitfn:Pernyataan `l !=NULL' gagal. Dibatalkan

Catatan: – Seperti yang dijelaskan sebelumnya, sering kali perilaku panggilan sistem vfork tidak dapat diprediksi. Seperti dalam kasus di atas itu telah dicetak sebelum sekali dan setelah dua kali tetapi membatalkan panggilan dengan fungsi _exit(). Lebih baik menggunakan panggilan sistem fork kecuali sebaliknya dan menghindari penggunaan vfork sebanyak mungkin.

Perbedaan antara fork() dan vfork()

Vfork() perilaku dijelaskan secara lebih rinci dalam program di bawah ini.

[email protected] ~}$ cat vfork_advanced.c#include #include #include int main(){    int n =10; pid_t pid =vfork(); //membuat proses turunan    if (pid ==0)          //jika ini adalah proses chile    {       printf("Proses turunan dimulai\n"); }    else//parent process execution    {        printf("Sekarang saya kembali ke proses induk\n"); }    printf("nilai n:%d \n",n); // pencetakan contoh untuk memeriksa nilai "n"    return 0;}[email protected] ~}$ cc vfork_advanced.c[email protected] ~}$ ./a.outChild process startvalue dari n:10Sekarang saya kembali ke nilai proses induk dari n:594325573a.out:cxa_atexit.c:100:__new_exitfn:Pernyataan `l !=NULL' gagal. Dibatalkan

Catatan: Sekali lagi jika Anda mengamati hasil vfork tidak ditentukan. Nilai "n" telah dicetak pertama kali sebagai 10, yang diharapkan. Tapi lain kali dalam proses induk itu telah mencetak beberapa nilai sampah.

tunggu()

wait() panggilan sistem menangguhkan eksekusi proses saat ini sampai anak telah keluar atau sampai sinyal telah dikirimkan yang tindakannya adalah untuk menghentikan proses saat ini atau penangan sinyal panggilan.

pid_t wait(int * status);

Ada panggilan sistem lain yang terkait dengan menunggu seperti di bawah ini,

1) tunggupid() :menangguhkan eksekusi proses saat ini hingga anak seperti yang ditentukan oleh argumen pid telah keluar atau hingga sinyal dikirimkan.

pid_t waitpid (pid_t pid, int *status, int options);

2) tunggu3() :Menangguhkan eksekusi proses saat ini hingga anak keluar atau hingga sinyal dikirimkan.

pid_t wait3(int *status, int options, struct rusage *rusage);

3) tunggu4() :Sama seperti wait3() tetapi menyertakan nilai pid_t pid.

pid_t wait3(pid_t pid, int *status, int options, struct rusage *rusage);

exec()

exec() keluarga  fungsi atau panggilan sistem menggantikan gambar proses saat ini dengan gambar proses baru.

Ada fungsi seperti execl , kecuali ,eksekusi ,eksekusi , execvp dan eksekusi digunakan untuk mengeksekusi file.

Fungsi-fungsi ini adalah kombinasi dari array pointer ke string diakhiri null yang mewakili daftar argumen, ini akan memiliki variabel path dengan beberapa kombinasi variabel lingkungan.

keluar()

Fungsi ini digunakan untuk penghentian proses normal. Status proses ditangkap untuk referensi di masa mendatang. Ada fungsi serupa lainnya exit(3) dan _exit(). , yang digunakan berdasarkan proses keluar yang menarik untuk digunakan atau ditangkap.

Kesimpulan:-

Kombinasi dari semua panggilan/fungsi sistem ini digunakan untuk pembuatan, eksekusi, dan modifikasi proses. Juga ini disebut set-of fungsi pemijahan "shell". Seseorang harus menggunakan fungsi-fungsi ini dengan hati-hati dengan mengingat hasil dan perilakunya.


Linux
  1. Cara menggunakan snapshot LVM untuk memulihkan sistem Linux

  2. Cara menggunakan perintah strace dan ltrace di Linux

  3. Cara Menginstal dan Menggunakan Glance untuk Memantau Sistem Linux

  1. Cara Menginstal dan Menggunakan Git di Sistem Linux

  2. Cara Menginstal dan Menggunakan Telnet di Sistem Linux

  3. Cara Memasang dan Menggunakan TeamViewer di Linux [Panduan Lengkap]

  1. Cara Menginstal dan Menggunakan Perintah Ack di Sistem Linux

  2. Bagaimana cara menghasilkan dan menggunakan kunci SSH di sistem Linux?

  3. Cara Menginstal dan Menggunakan Nmap di Linux Mint 20