Rajah 1: Aliran kerja garpu asas ()
Dalam artikel ini, saya akan menunjukkan kepada anda bagaimana menggunakan panggilan sistem garpu () untuk membuat proses anak di C. Oleh itu, mari kita mulakan.
garpu () Sintaks dan Nilai Pulangan:
Sintaks fungsi sistem garpu () adalah seperti berikut:
garpu pid_t (tidak sah);Fungsi sistem garpu () tidak menerima sebarang hujah. Ia mengembalikan nombor bulat pid_t.
Setelah berjaya, garpu () mengembalikan PID proses anak yang lebih besar daripada 0. Di dalam proses anak, nilai pulangan adalah 0. Sekiranya garpu () gagal, maka ia mengembalikan -1.
Garpu sederhana () Contoh:
Contoh garpu sederhana () diberikan di bawah:
#sertakan#sertakan
#sertakan
#sertakan
#sertakan
int utama (tidak sah)
pid_t pid = garpu ();
jika (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
jalan keluar (EXIT_SUCCESS);
lain jika (pid> 0)
printf ("Ibu bapa => PID:% d \ n", getpid ());
printf ("Menunggu proses anak selesai.\ n ");
tunggu (NULL);
printf ("Proses kanak-kanak selesai.\ n ");
lain
printf ("Tidak dapat membuat proses anak.\ n ");
pulangkan EXIT_SUCCESS;
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
batal anakTugas ()
printf ("Hello World \ n");
kosongkan ibu bapaTugas ()
printf ("Tugas utama.\ n ");
int utama (tidak sah)
pid_t pid = garpu ();
jika (pid == 0)
childTask ();
jalan keluar (EXIT_SUCCESS);
lain jika (pid> 0)
tunggu (NULL);
Tugas ibu bapa ();
lain
printf ("Tidak dapat membuat proses anak.");
pulangkan EXIT_SUCCESS;
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
int utama (tidak sah)
untuk (int i = 1; i <= 5; i++)
pid_t pid = garpu ();
jika (pid == 0)
printf ("Proses kanak-kanak => PPID =% d, PID =% d \ n", getppid (), getpid ());
jalan keluar (0);
lain
printf ("Proses ibu bapa => PID =% d \ n", getpid ());
printf ("Menunggu proses anak selesai ... \ n");
tunggu (NULL);
printf ("proses anak selesai.\ n ");
pulangkan EXIT_SUCCESS;
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 dan lain-lain 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 menghantarnya ke proses induk, program utama. Kemudian, saya mencetak kod PIN dari sana.
#sertakan#sertakan
#sertakan
#sertakan
#sertakan
int getPIN ()
// gunakan PPID dan PID sebagai benih
srand (getpid () + getppid ());
int rahsia = 1000 + rand ()% 9000;
rahsia kembali;
int utama (tidak sah)
int fd [2];
paip (fd);
pid_t pid = garpu ();
jika (pid> 0)
tutup (0);
tutup (fd [1]);
dup (fd [0]);
int rahsiaNombor;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Menunggu PIN ... \ n");
tunggu (NULL);
printf ("Bytes read:% ld \ n", readBytes);
printf ("PIN:% d \ n", nombor rahsia);
lain jika (pid == 0)
tutup (1);
tutup (fd [0]);
dup (fd [1]);
int rahsia = getPIN ();
tulis (fd [1], & rahsia, sizeof (rahsia));
jalan keluar (EXIT_SUCCESS);
pulangkan EXIT_SUCCESS;
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.