Panggilan Sistem Fork Linux

Fork System Call Linux



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 pada 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 induk anak.

Properti Proses Anak

Berikut ini adalah beberapa properti yang dimiliki oleh proses anak:





  1. Penghitung CPU dan pemanfaatan sumber daya diinisialisasi untuk me-reset 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.
  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 terkait dari proses anak. Jadi kita dapat mengatakan bahwa nilai flag dari deskriptor file ini adalah 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. Timer 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 fork(), dapat digunakan untuk type pid_t untuk proses ID sebagai pid_t didefinisikan dalam .

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

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

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.

No arguments are passed to 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

ke dalamutama()
{
garpu();
printf ('Menggunakan panggilan sistem fork() ');
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, baik 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 2nkali, di mana n adalah jumlah panggilan sistem fork().

Jadi ketika panggilan fork() digunakan satu kali seperti di atas (21= 2) kita akan memiliki 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

ke dalamutama()
{
garpu();
garpu();
garpu();
garpu();
printf ('Menggunakan panggilan sistem fork()');
kembali 0;
}

Keluaran:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using 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, kita telah menggunakan konstruk pengambilan keputusan untuk menguji nilai (int) yang dikembalikan oleh fork(). Dan pesan yang sesuai ditampilkan:

KODE:

#termasuk
#termasuk
#termasuk

ke dalamutama()
{
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.