Pengaturcaraan C

Panggilan Sistem Fork di C

Panggilan Sistem Fork di 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 tidak terkawal.h. Dalam program di mana anda menggunakan garpu, anda juga harus menggunakan panggilan sistem tunggu (). tunggu () panggilan sistem 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 ()

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.

Shadow of the Tomb Raider untuk Tutorial Linux
Shadow of the Tomb Raider adalah penambahan kedua belas untuk siri Tomb Raider - francais permainan aksi-pengembaraan yang dibuat oleh Eidos Montreal....
Cara Meningkatkan FPS di Linux?
FPS bermaksud Bingkai sesaat. Tugas FPS adalah mengukur kadar bingkai dalam pemutaran video atau persembahan permainan. Dengan kata mudah bilangan gam...
Permainan Makmal Apl Oculus Teratas
Sekiranya anda adalah pemilik alat dengar Oculus, maka anda mesti mengetahui tentang memuatkan sideload. Sideloading adalah proses memasang kandungan ...