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







Semasa proses kanak-kanak dibuat; sekarang kedua-dua proses tersebut akan mempunyai Program Counter (PC) yang sama, jadi kedua proses ini akan menunjukkan petunjuk seterusnya yang sama. Fail yang dibuka oleh proses induk akan sama untuk proses anak.



Proses anak sama seperti ibu bapa tetapi terdapat perbezaan dalam proses ID:



  1. ID proses proses anak adalah ID proses unik yang berbeza dari ID semua proses lain 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 pengimbangan 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. Deskriptor pesanan terbuka proses ibu bapa diwarisi oleh proses anak. Contohnya 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 bagi 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 header adalah di mana fork () ditentukan, jadi anda harus memasukkannya ke program anda untuk menggunakan fork ().

Jenis kembali ditentukan dalam dan panggilan fork () didefinisikan dalam. Oleh itu, anda perlu memasukkan kedua-duanya 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.

No arguments are passed to fork(). 

Contoh 1: Memanggil garpu ()

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

KOD:

#sertakan
#sertakan
#sertakan

intutama()
{
garpu();
printf ('Menggunakan sistem panggilan fork () n');
kembali 0;
}

PENGELUARAN:

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

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 yang tersisa atau pernyataan C akan dilaksanakan jumlah masa proses, iaitu 2nkali, 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

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

Pengeluaran:

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 proses yang dibuat adalah 24= 16 dan penyata cetak kami dilaksanakan 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

intutama()
{
pid_t hlm;
hlm=garpu();
sekiranya(hlm== -1)
{
printf ('Terdapat ralat semasa memanggil garpu ()');
}
sekiranya(hlm==0)
{
printf ('Kami sedang dalam proses anak');
}
yang lain
{
printf ('Kami sedang dalam proses ibu bapa');
}
kembali 0;
}

PENGELUARAN:

Kami dalam proses ibu bapa
Kami sedang dalam proses anak

Dalam contoh di atas kami telah menggunakan jenis pid_t yang akan menyimpan nilai pulangan garpu (). garpu () dipanggil secara on line:

hlm=garpu();

Jadi nilai integer yang dikembalikan oleh garpu () disimpan dalam p dan kemudian p dibandingkan untuk memeriksa apakah panggilan garpu kami () berjaya.

Apabila panggilan fork () 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.