Panggilan Sistem Fork
Panggilan sistem garpu digunakan untuk membuat proses baru. Proses yang baru dibuat adalah proses anak. Proses yang memerlukan garpu dan membuat proses baru adalah proses induk. Proses anak dan ibu bapa dilaksanakan secara serentak.
Tetapi proses anak dan ibu bapa berada di ruang memori yang berbeza. Ruang memori ini mempunyai kandungan yang sama dan apa sahaja operasi yang dilakukan oleh satu proses tidak akan mempengaruhi proses yang lain.
Apabila proses kanak-kanak dibuat; sekarang kedua-dua proses tersebut akan mempunyai Program Counter (PC) yang sama, jadi kedua proses ini akan menunjukkan arahan seterusnya yang sama. Fail yang dibuka oleh proses induk akan sama untuk proses anak.
Proses anak betul-betul sama dengan induknya tetapi terdapat perbezaan dalam proses ID:
- ID proses proses anak adalah ID proses unik yang berbeza dengan ID dari semua proses yang ada.
- ID proses Ibu Bapa akan sama dengan ID proses ibu bapa anak.
Sifat Proses Anak
Berikut adalah beberapa sifat yang dimiliki oleh proses anak:
- Kaunter CPU dan penggunaan sumber dimulakan untuk diset semula ke sifar.
- Apabila proses ibu bapa ditamatkan, proses anak tidak menerima sebarang isyarat kerana atribut PR_SET_PDEATHSIG di prctl () diset semula.
- Benang yang digunakan untuk memanggil garpu () membuat proses anak. Jadi alamat proses anak akan sama dengan ibu bapa.
- Deskriptor fail proses ibu bapa diwarisi oleh proses anak. Contohnya, mengimbangi fail atau status bendera dan atribut I / O akan dikongsi di antara penerangan fail proses anak dan ibu bapa. Jadi deskriptor fail kelas induk akan merujuk kepada deskriptor fail kelas anak yang sama.
- Penerangan antrian pesanan terbuka mengenai proses ibu bapa diwarisi oleh proses anak. Sebagai contoh jika deskriptor fail mengandungi mesej dalam proses induk, mesej yang sama akan terdapat dalam deskriptor fail proses anak. Oleh itu, kita boleh mengatakan bahawa nilai bendera deskriptor fail ini sama.
- Begitu juga aliran direktori terbuka akan diwarisi oleh proses anak.
- Nilai slack Timer lalai kelas anak sama dengan nilai slack pemasa kelas induk semasa.
Harta yang tidak diwarisi oleh proses Anak
Berikut adalah beberapa sifat yang tidak diwarisi oleh proses anak:
- Kunci memori
- Isyarat belum selesai kelas kanak-kanak kosong.
- Memproses kunci rekod yang berkaitan (fcntl ())
- Operasi I / O tak segerak dan kandungan I / O.
- Pemberitahuan perubahan direktori.
- Pemasa seperti penggera (), setitimer () tidak diwarisi oleh kelas kanak-kanak.
garpu () di C
Tidak ada argumen di garpu () dan jenis kembali garpu () adalah bilangan bulat. Anda mesti memasukkan fail tajuk berikut semasa garpu () digunakan:
#sertakan#sertakan
#sertakan
Semasa bekerja dengan garpu (),
Fail pengepala
Jenis pengembalian ditentukan dalam
Sintaks garpu ()
Sintaks panggilan sistem fork () di Linux, Ubuntu adalah seperti berikut:
garpu pid_t (tidak sah);Dalam sintaks jenis pengembalian adalah pid_t. Apabila proses anak berjaya dibuat, PID proses anak dikembalikan dalam proses ibu bapa dan 0 akan dikembalikan ke proses anak itu sendiri.
Sekiranya terdapat ralat maka -1 dikembalikan ke proses ibu bapa dan proses anak tidak dibuat.
Tidak ada hujah yang dihantar ke garpu ().
Contoh 1: Memanggil garpu ()
Pertimbangkan contoh berikut di mana kita telah menggunakan panggilan sistem garpu () untuk membuat proses anak baru:
KOD:
#sertakan#sertakan
#sertakan
int utama ()
garpu ();
printf ("Menggunakan garpu () panggilan sistem \ n");
pulangan 0;
PENGELUARAN:
Menggunakan panggilan sistem garpu ()Menggunakan panggilan sistem garpu ()
Dalam program ini, kami telah menggunakan garpu (), ini akan membuat proses anak baru. Apabila proses anak dibuat, proses ibu bapa dan proses anak akan menunjukkan arahan seterusnya (Kaunter Program yang sama). Dengan cara ini, arahan atau pernyataan C yang tersisa akan dilaksanakan jumlah masa proses, iaitu 2n kali, di mana n adalah bilangan panggilan sistem fork ().
Jadi apabila panggilan garpu () digunakan satu kali seperti di atas (21 = 2) kita akan mendapat output kita 2 kali.
Di sini apabila panggilan sistem garpu () digunakan, struktur dalaman akan kelihatan seperti:
Pertimbangkan kes berikut di mana garpu () digunakan 4 kali:
KOD:
#sertakan#sertakan
#sertakan
int utama ()
garpu ();
garpu ();
garpu ();
garpu ();
printf ("Menggunakan fork () panggilan sistem");
pulangan 0;
Pengeluaran:
Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem Menggunakan garpu () panggilan sistem
Sekarang jumlah proses yang dibuat adalah 24 = 16 dan penyata cetak kami dilaksanakan sebanyak 16 kali.
Contoh 2: Menguji apakah garpu () berjaya
Dalam contoh berikut, kami telah menggunakan konstruk membuat keputusan untuk menguji nilai (int) yang dikembalikan oleh garpu (). Dan mesej yang sesuai dipaparkan:
KOD:
#sertakan#sertakan
#sertakan
int utama ()
pid_t p;
p = garpu ();
jika (p == - 1)
printf ("Terdapat ralat semasa memanggil garpu ()");
jika (p == 0)
printf ("Kami sedang dalam proses kanak-kanak");
yang lain
printf ("Kami sedang dalam proses ibu bapa");
pulangan 0;
PENGELUARAN:
Kami dalam proses ibu bapaKami dalam proses kanak-kanak
Dalam contoh di atas kami telah menggunakan jenis pid_t yang akan menyimpan nilai kembali garpu (). garpu () dipanggil secara on line:
p = garpu ();Jadi nilai integer yang dikembalikan oleh garpu () disimpan dalam p dan kemudian p dibandingkan dengan memeriksa apakah panggilan garpu kami () berjaya.
Apabila panggilan garpu () digunakan dan anak berjaya dibuat, id proses anak akan dikembalikan ke proses ibu bapa dan 0 akan dikembalikan ke proses anak.ID proses anak dalam proses Ibu bapa tidak akan sama dengan ID proses anak dalam proses anak itu sendiri. Dalam proses kanak-kanak ID proses anak akan 0.
Dengan tutorial ini, anda dapat melihat bagaimana memulakan panggilan sistem garpu di linux.