Panggilan Sistem Fork di C

Fork System Call C



panggilan sistem fork () digunakan untuk membuat proses anak dalam program C. garpu () digunakan di mana pemprosesan selari diperlukan dalam aplikasi anda. Fungsi sistem garpu () ditentukan dalam tajuk sys / jenis.h dan unistd.h . Dalam program di mana anda menggunakan garpu, anda juga harus menggunakan panggilan sistem tunggu (). tunggu () sistem panggilan digunakan untuk menunggu dalam proses ibu bapa sehingga proses anak selesai. Untuk menyelesaikan proses anak, panggilan sistem keluar () digunakan dalam proses anak. Fungsi tunggu () ditakrifkan dalam tajuk sys / tunggu.h dan fungsi keluar () didefinisikan dalam tajuk stdlib.h .

Rajah 1: Aliran kerja garpu asas ()

Rajah 1: Aliran kerja garpu asas ()







Dalam artikel ini, saya akan menunjukkan kepada anda cara menggunakan panggilan sistem garpu () untuk membuat proses anak di C. Oleh itu, mari kita mulakan.



fork () Sintaks dan Nilai Pulangan:

Sintaks fungsi sistem garpu () adalah seperti berikut:



garpu pid_t(batal);

Fungsi sistem garpu () tidak menerima sebarang hujah. Ia mengembalikan nombor bulat pid_t .





Pada kejayaan, garpu () mengembalikan PID proses anak yang lebih besar daripada 0. Di dalam proses anak, nilai pengembalian adalah 0. Sekiranya garpu () gagal, maka ia mengembalikan -1.

Garpu sederhana () Contoh:

Contoh garpu sederhana () diberikan di bawah:



#sertakan
#sertakan
#sertakan
#sertakan
#sertakan

intutama(batal) {
pid_t pid=garpu();

sekiranya(pid== 0) {
printf ('Child => PPID:% d PID:% d n',getppid(),getpid());
jalan keluar (KECUALI_ KEBERHASILAN);
}
yang lain sekiranya(pid> 0) {
printf ('Ibu bapa => PID:% d n',getpid());
printf ('Menunggu proses anak selesai. n');
tunggu(BULAN);
printf ('Proses anak selesai. n');
}
yang lain {
printf ('Tidak dapat membuat proses anak. n');
}

kembaliKECUALI_ KEBERHASILAN;
}

Di sini, saya menggunakan garpu () untuk membuat proses anak dari proses utama / ibu bapa. Kemudian, saya mencetak PID (Process ID) dan PPID (Parent Process ID) dari proses anak dan ibu bapa. Pada proses ibu bapa tunggu (NULL) digunakan untuk menunggu proses anak selesai. Pada proses anak, jalan keluar () digunakan untuk menyelesaikan proses anak. Seperti yang anda lihat, PID proses ibu bapa adalah PPID proses anak. Jadi, proses anak 24738 tergolong dalam proses ibu bapa 24731 .

Anda juga dapat menggunakan fungsi untuk menjadikan program anda lebih modular. Di sini, saya gunakan proses Tugas () dan Tugas ibu bapa () berfungsi untuk proses anak dan ibu bapa masing-masing. Ini adalah bagaimana garpu () sebenarnya digunakan.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan

batalanakTugas() {
printf ('Hai dunia n');
}

batalTugas ibu bapa() {
printf ('Tugas utama. n');
}

intutama(batal) {
pid_t pid=garpu();

sekiranya(pid== 0) {
anakTugas();
jalan keluar (KECUALI_ KEBERHASILAN);
}
yang lain sekiranya(pid> 0) {
tunggu(BULAN);
Tugas ibu bapa();
}
yang lain {
printf ('Tidak dapat membuat proses anak.');
}

kembaliKECUALI_ KEBERHASILAN;
}

Hasil daripada program di atas:

Menjalankan Banyak Proses Anak menggunakan garpu () dan Gelung:

Anda juga boleh menggunakan gelung untuk membuat sebilangan proses anak yang anda perlukan. Dalam contoh di bawah, saya telah membuat 5 proses anak menggunakan loop. Saya juga mencetak PID dan PPID dari proses kanak-kanak.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan

intutama(batal) {
untuk(inti= 1;i<= 5;i++) {
pid_t pid=garpu();

sekiranya(pid== 0) {
printf ('Proses anak => PPID =% d, PID =% d n',getppid(),getpid());
jalan keluar (0);
}
yang lain {
printf ('Proses ibu bapa => PID =% d n',getpid());
printf ('Menunggu proses anak selesai ... n');
tunggu(BULAN);
printf ('proses anak selesai. n');
}
}

kembaliKECUALI_ KEBERHASILAN;
}

Seperti yang anda lihat, ID proses Ibu bapa adalah sama dalam semua proses anak. Jadi, semuanya tergolong dalam ibu bapa yang sama. Mereka juga melakukan secara linear. Satu demi satu. Mengawal proses anak adalah tugas yang canggih. Sekiranya anda mengetahui lebih lanjut mengenai pengaturcaraan sistem Linux dan cara kerjanya, anda akan dapat mengawal aliran proses ini mengikut keinginan anda.

Contoh Kehidupan Sebenar:

Pengiraan matematik kompleks yang berbeza seperti penghasilan hash md5, sha256 dll memerlukan banyak daya pemprosesan. Daripada mengira perkara seperti itu dalam proses yang sama dengan program utama, anda hanya boleh mengira hash pada proses anak dan mengembalikan hash ke proses utama.

Dalam contoh berikut, saya telah menghasilkan kod PIN 4 digit dalam proses anak dan mengirimkannya ke proses induk, program utama. Kemudian, saya mencetak kod PIN dari sana.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan

intdapatkanPIN() {
// gunakan PPID dan PID sebagai benih
srand (getpid() +getppid());
intrahsia= 1000 + barisan () % 9000;
kembalirahsia;
}

intutama(batal) {
intfd[2];
paip(fd);
pid_t pid=garpu();

sekiranya(pid> 0) {
tutup(0);
tutup(fd[1]);
selepas(fd[0]);

intnombor rahsia;
saiz_tbacaBait=membaca(fd[0], &nombor rahsia, saiz(nombor rahsia));

printf ('Menunggu PIN ... n');
tunggu(BULAN);
printf ('Bait dibaca:% ld n',bacaBait);
printf ('PIN:% d n',nombor rahsia);
}
yang lain sekiranya(pid== 0) {
tutup(1);
tutup(fd[0]);
selepas(fd[1]);

intrahsia=dapatkanPIN();
menulis(fd[1], &rahsia, saiz(rahsia));
jalan keluar (KECUALI_ KEBERHASILAN);
}

kembaliKECUALI_ KEBERHASILAN;
}

Seperti yang anda lihat, setiap kali saya menjalankan program, saya mendapat kod PIN 4 digit yang berbeza.

Jadi, itulah asasnya anda menggunakan panggilan sistem fork () di Linux. Terima kasih kerana membaca artikel ini.