Panggilan Sistem

Panggilan Sistem Fork Linux

Panggilan Sistem Fork Linux

Panggilan Sistem Fork

Panggilan sistem garpu digunakan untuk membuat proses baru. Proses yang baru dibuat adalah proses anak. Proses yang memanggil fork dan membuat proses baru adalah proses induk. Proses anak dan induk dijalankan secara bersamaan.

Tetapi proses anak dan induk berada di ruang memori yang berbeda. Ruang memori ini memiliki konten yang sama dan operasi apa pun yang dilakukan oleh satu proses tidak akan memengaruhi proses lainnya.

Ketika proses anak dibuat; sekarang kedua proses akan memiliki Program Counter (PC) yang sama, sehingga kedua proses ini akan menunjuk ke instruksi berikutnya yang sama. File yang dibuka oleh proses induk akan sama untuk proses anak.

Proses anak persis sama dengan induknya tetapi ada perbedaan dalam ID proses:

  1. ID proses dari proses anak adalah ID proses unik yang berbeda dari ID semua proses lain yang ada.
  2. ID proses Induk akan sama dengan ID proses orangtua anak.

Properti Proses Anak

Berikut ini adalah beberapa properti yang dimiliki oleh proses anak:

  1. Penghitung CPU dan pemanfaatan sumber daya diinisialisasi untuk mengatur ulang ke nol.
  2. Ketika proses induk dihentikan, proses anak tidak menerima sinyal apa pun karena atribut PR_SET_PDEATHSIG di prctl() direset.
  3. Utas yang digunakan untuk memanggil fork() membuat proses anak. Jadi alamat proses anak akan sama dengan alamat orang tua.
  4. Deskriptor file dari proses induk diwarisi oleh proses anak. Misalnya offset file atau status flag dan atribut I/O akan dibagikan di antara deskriptor file dari proses anak dan induk. Jadi deskriptor file kelas induk akan merujuk ke deskriptor file yang sama dari kelas anak child.
  5. Deskriptor antrian pesan terbuka dari proses induk diwarisi oleh proses anak. Misalnya jika deskriptor file berisi pesan dalam proses induk, pesan yang sama akan ada di deskriptor file yang sesuai dari proses anak. Jadi kita dapat mengatakan bahwa nilai flag dari deskriptor file ini sama.
  6. Demikian pula aliran direktori terbuka akan diwarisi oleh proses anak.
  7. Nilai slack Timer default dari kelas anak sama dengan nilai slack timer saat ini dari kelas induk.

Properti yang tidak diwarisi oleh proses Anak

Berikut ini adalah beberapa properti yang tidak diwarisi oleh proses anak:

  1. Kunci memori
  2. Sinyal tertunda dari kelas anak kosong.
  3. Proses kunci rekaman terkait (fcntl())
  4. Operasi I/O asinkron dan konten I/O.
  5. Pemberitahuan perubahan direktori.
  6. Pengatur waktu seperti alarm(), setitimer() tidak diwarisi oleh kelas anak.

garpu() di C

Tidak ada argumen di fork() dan tipe pengembalian fork() adalah integer. Anda harus menyertakan file header berikut saat fork() digunakan:

#termasuk
#termasuk
#termasuk

Saat bekerja dengan garpu(), dapat digunakan untuk tipe pid_t untuk proses ID sebagai pid_t didefinisikan dalam .

File headernya adalah tempat fork() didefinisikan sehingga Anda harus memasukkannya ke program Anda untuk menggunakan fork().

Tipe pengembalian didefinisikan dalam dan fork() panggilan didefinisikan dalam . Oleh karena itu, Anda perlu menyertakan keduanya dalam program Anda untuk menggunakan fork() system call.

Sintaks garpu()

Sintaks fork() system call di Linux, Ubuntu adalah sebagai berikut:

garpu pid_t(kosong);

Dalam sintaks tipe pengembaliannya adalah pid_t. Ketika proses anak berhasil dibuat, PID dari proses anak dikembalikan dalam proses induk dan 0 akan dikembalikan ke proses anak itu sendiri.

Jika ada kesalahan maka -1 dikembalikan ke proses induk dan proses anak tidak dibuat.

Tidak ada argumen yang diteruskan ke fork(). 

Contoh 1: Memanggil garpu()

Pertimbangkan contoh berikut di mana kami telah menggunakan panggilan sistem fork() untuk membuat proses anak baru:

KODE:

#termasuk
#termasuk
#termasuk
int utama()

garpu();
printf("Menggunakan fork() panggilan sistem\n");
kembali 0;

KELUARAN:

Menggunakan fork() panggilan sistem
Menggunakan fork() panggilan sistem

Dalam program ini, kami telah menggunakan fork(), ini akan membuat proses anak baru. Ketika proses anak dibuat, proses induk dan proses anak akan menunjuk ke instruksi berikutnya (Penghitung Program yang sama). Dengan cara ini instruksi atau pernyataan C yang tersisa akan dieksekusi jumlah total waktu proses, yaitu 2tidak kali, di mana n adalah jumlah panggilan sistem fork().

Jadi ketika panggilan fork() digunakan satu kali seperti di atas (21 = 2) kita akan mendapatkan output kita 2 kali.

Di sini ketika panggilan sistem fork() digunakan, struktur internal akan terlihat seperti:

Pertimbangkan kasus berikut di mana fork() digunakan 4 kali:

KODE:

#termasuk
#termasuk
#termasuk
int utama()

garpu();
garpu();
garpu();
garpu();
printf("Menggunakan panggilan sistem fork()");
kembali 0;

Keluaran:

Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork () system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call Menggunakan fork() system call 

Sekarang jumlah total proses yang dibuat adalah 24 = 16 dan pernyataan cetak kami dieksekusi 16 kali.

Contoh 2: Menguji apakah fork() berhasil

Dalam contoh berikut, kami telah menggunakan konstruk pengambilan keputusan untuk menguji nilai (int) yang dikembalikan oleh fork(). Dan pesan yang sesuai ditampilkan:

KODE:

#termasuk
#termasuk
#termasuk
int utama()

pid_t p;
p = garpu();
jika(p==-1)

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

jika(p==0)

printf("Kami sedang dalam proses anak");

lain

printf("Kami sedang dalam proses induk");

kembali 0;

KELUARAN:

Kami sedang dalam proses induk
Kami sedang dalam proses anak

Pada contoh di atas kita telah menggunakan tipe pid_t yang akan menyimpan nilai kembalian dari fork(). fork() dipanggil secara online:

p = garpu();

Jadi nilai integer yang dikembalikan oleh fork() disimpan dalam p dan kemudian p dibandingkan untuk memeriksa apakah panggilan fork() kita berhasil.

Ketika panggilan fork() digunakan dan anak berhasil dibuat, id proses anak akan dikembalikan ke proses induk dan 0 akan dikembalikan ke proses anak.ID proses anak dalam proses Induk tidak akan sama dengan ID proses anak dalam proses anak itu sendiri. Dalam proses anak, ID proses anak akan menjadi 0.

Dengan tutorial ini Anda dapat melihat cara memulai panggilan sistem fork di linux.

Game Baris Perintah Terbaik untuk Linux
Baris perintah bukan hanya sekutu terbesar Anda saat menggunakan Linux-ini juga dapat menjadi sumber hiburan karena Anda dapat menggunakannya untuk me...
Aplikasi Pemetaan Gamepad Terbaik untuk Linux
Jika Anda suka bermain game di Linux dengan gamepad alih-alih sistem input keyboard dan mouse biasa, ada beberapa aplikasi yang berguna untuk Anda. Ba...
Alat Berguna untuk Gamer Linux
Jika Anda suka bermain game di Linux, kemungkinan besar Anda telah menggunakan aplikasi dan utilitas seperti Wine, Lutris, dan OBS Studio untuk mening...