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 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:

  1. ID proses proses anak adalah ID proses unik yang berbeza dengan ID dari semua proses yang ada.
  2. ID proses Ibu Bapa akan sama dengan ID proses ibu bapa anak.

Sifat Proses Anak

Berikut adalah beberapa sifat yang dimiliki oleh proses anak:

  1. Kaunter CPU dan penggunaan sumber dimulakan untuk diset semula ke sifar.
  2. Apabila proses ibu bapa ditamatkan, proses anak tidak menerima sebarang isyarat kerana atribut PR_SET_PDEATHSIG di prctl () diset semula.
  3. Benang yang digunakan untuk memanggil garpu () membuat proses anak. Jadi alamat proses anak akan sama dengan ibu bapa.
  4. 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.
  5. 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.
  6. Begitu juga aliran direktori terbuka akan diwarisi oleh proses anak.
  7. 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:

  1. Kunci memori
  2. Isyarat belum selesai kelas kanak-kanak kosong.
  3. Memproses kunci rekod yang berkaitan (fcntl ())
  4. Operasi I / O tak segerak dan kandungan I / O.
  5. Pemberitahuan perubahan direktori.
  6. 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 (), boleh digunakan untuk jenis pid_t untuk proses ID seperti pid_t ditakrifkan dalam .

Fail pengepala adalah di mana garpu () didefinisikan sehingga anda harus memasukkannya ke dalam program anda untuk menggunakan garpu ().

Jenis pengembalian ditentukan dalam dan fork () panggilan ditakrifkan dalam . Oleh itu, anda perlu memasukkan keduanya dalam program anda untuk menggunakan panggilan sistem fork ().

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 bapa
Kami 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.

Cara Menunjukkan Overlay OSD dalam Aplikasi dan Permainan Linux Skrin Penuh
Bermain permainan skrin penuh atau menggunakan aplikasi dalam mod skrin penuh bebas gangguan dapat memisahkan anda dari maklumat sistem yang relevan y...
5 Kad Tangkap Permainan Teratas
Kita semua telah melihat dan menyukai streaming permainan permainan di YouTube. PewDiePie, Jakesepticye, dan Markiplier hanyalah beberapa pemain terat...
Cara Membangunkan Permainan di Linux
Satu dekad yang lalu, tidak banyak pengguna Linux akan meramalkan bahawa sistem operasi kegemaran mereka suatu hari nanti akan menjadi platform permai...