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.