Panggilan Sistem Fork di C

Fork System Call C



fork() panggilan sistem digunakan untuk membuat proses anak dalam program C. fork() digunakan di mana pemrosesan paralel diperlukan dalam aplikasi Anda. Fungsi sistem fork() didefinisikan di header sys/types.h dan unistd.h . Dalam program di mana Anda menggunakan fork, Anda juga harus menggunakan panggilan sistem wait(). panggilan sistem wait() digunakan untuk menunggu dalam proses induk hingga proses anak selesai. Untuk menyelesaikan proses anak, panggilan sistem exit() digunakan dalam proses anak. Fungsi wait() didefinisikan di header sys/tunggu.h dan fungsi exit() didefinisikan di header stdlib.h .

Gambar 1: Alur kerja garpu () dasar

Gambar 1: Alur kerja garpu () dasar







Dalam artikel ini, saya akan menunjukkan cara menggunakan fork() system call untuk membuat proses anak di C. Jadi, mari kita mulai.



fork() Sintaks dan Nilai Pengembalian:

Sintaks fungsi sistem fork() adalah sebagai berikut:



garpu pid_t(ruang kosong);

Fungsi sistem fork() tidak menerima argumen apa pun. Ini mengembalikan bilangan bulat dari tipe pid_t .





Jika berhasil, fork() mengembalikan PID dari proses anak yang lebih besar dari 0. Di dalam proses anak, nilai yang dikembalikan adalah 0. Jika fork() gagal, maka akan mengembalikan -1.

Garpu sederhana() Contoh:

Contoh fork() sederhana diberikan di bawah ini:



#termasuk
#termasuk
#termasuk
#termasuk
#termasuk

ke dalamutama(ruang kosong) {
pid_t pid=garpu();

jika(pid== 0) {
printf ('Anak => PPID: %d PID: %d ',getppid(),getpid());
keluar (EXIT_SUCCESS);
}
lain jika(pid> 0) {
printf ('Induk => PID: %d ',getpid());
printf ('Menunggu proses anak selesai. ');
tunggu(BATAL);
printf ('Proses anak selesai. ');
}
lain {
printf ('Tidak dapat membuat proses anak. ');
}

kembaliEXIT_SUCCESS;
}

Di sini, saya menggunakan fork() untuk membuat proses anak dari proses utama/induk. Kemudian, saya mencetak PID (Process ID) dan PPID (Parent Process ID) dari proses anak dan induk. Pada proses induk wait(NULL) digunakan untuk menunggu proses anak selesai. Pada proses anak, exit() digunakan untuk menyelesaikan proses anak. Seperti yang Anda lihat, PID dari proses induk adalah PPID dari proses anak. Jadi, proses anak 24738 milik proses induk 24731 .

Anda juga dapat menggunakan fungsi untuk membuat program Anda lebih modular. Di sini, saya menggunakan prosesTugas() dan tugas orang tua() fungsi untuk proses anak dan orang tua masing-masing. Beginilah cara fork() sebenarnya digunakan.

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk

ruang kosongtugas anak() {
printf ('Halo Dunia ');
}

ruang kosongtugas orang tua() {
printf ('Tugas utama. ');
}

ke dalamutama(ruang kosong) {
pid_t pid=garpu();

jika(pid== 0) {
tugas anak();
keluar (EXIT_SUCCESS);
}
lain jika(pid> 0) {
tunggu(BATAL);
tugas orang tua();
}
lain {
printf ('Tidak dapat membuat proses anak.');
}

kembaliEXIT_SUCCESS;
}

Keluaran dari program di atas:

Menjalankan Beberapa Proses Anak menggunakan fork() dan Loop:

Anda juga dapat menggunakan loop untuk membuat proses anak sebanyak yang Anda butuhkan. Pada contoh di bawah ini, saya telah membuat 5 proses anak menggunakan for loop. Saya juga mencetak PID dan PPID dari proses anak.

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk

ke dalamutama(ruang kosong) {
untuk(ke dalamSaya= 1;Saya<= 5;Saya++) {
pid_t pid=garpu();

jika(pid== 0) {
printf ('Proses turunan => PPID=%d, PID=%d ',getppid(),getpid());
keluar (0);
}
lain {
printf ('Proses induk => PID=%d ',getpid());
printf ('Menunggu proses anak selesai... ');
tunggu(BATAL);
printf ('proses anak selesai. ');
}
}

kembaliEXIT_SUCCESS;
}

Seperti yang Anda lihat, ID proses Induk sama di semua proses anak. Jadi, mereka semua milik orang tua yang sama. Mereka juga mengeksekusi secara linier. Satu demi satu. Mengontrol proses anak adalah tugas yang rumit. Jika Anda mempelajari lebih lanjut tentang pemrograman sistem Linux dan cara kerjanya, Anda akan dapat mengontrol aliran proses ini sesuka Anda.

Contoh Kehidupan Nyata:

Perhitungan matematis kompleks yang berbeda seperti md5, sha256 dll generasi hash membutuhkan banyak kekuatan pemrosesan. Alih-alih menghitung hal-hal seperti itu dalam proses yang sama dengan program utama, Anda cukup menghitung hash pada proses anak dan mengembalikan hash ke proses utama.

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

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk

ke dalamdapatkanPIN() {
// gunakan PPID dan PID sebagai seed
srand (getpid() +getppid());
ke dalamrahasia= 1000 + baris () % 9000;
kembalirahasia;
}

ke dalamutama(ruang kosong) {
ke dalamfd[2];
pipa(fd);
pid_t pid=garpu();

jika(pid> 0) {
Menutup(0);
Menutup(fd[1]);
setelah(fd[0]);

ke dalamnomor rahasia;
ukuran_treadBytes=Baca(fd[0], &nomor rahasia, ukuran dari(nomor rahasia));

printf ('Menunggu PIN... ');
tunggu(BATAL);
printf ('Byte dibaca: %ld ',readBytes);
printf ('PIN: %d ',nomor rahasia);
}
lain jika(pid== 0) {
Menutup(1);
Menutup(fd[0]);
setelah(fd[1]);

ke dalamrahasia=dapatkanPIN();
menulis(fd[1], &rahasia, ukuran dari(rahasia));
keluar (EXIT_SUCCESS);
}

kembaliEXIT_SUCCESS;
}

Seperti yang Anda lihat, setiap kali saya menjalankan program, saya mendapatkan kode PIN 4 digit yang berbeda.

Jadi, pada dasarnya itulah cara Anda menggunakan panggilan sistem fork() di Linux. Terima kasih telah membaca artikel ini.