Pemrograman C

Panggilan Sistem Fork di C

Panggilan Sistem Fork di 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 sistem/jenis.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 sis/tunggu.h dan fungsi exit() didefinisikan di header stdlib.h.

Gambar 1: Alur kerja garpu () dasar

Dalam artikel ini, saya akan menunjukkan kepada Anda cara menggunakan panggilan sistem fork() 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(kosong);

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

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

Garpu sederhana() Contoh:

Contoh fork() sederhana diberikan di bawah ini:

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
 
int utama(kosong)
pid_t pid = garpu();
 
jika(pid == 0)
printf("Anak => PPID: %d PID: %d\n", getppid(), getpid());
keluar(EXIT_SUCCESS);

else if(pid > 0)
printf("Induk => PID: %d\n", getpid());
printf("Menunggu proses anak selesai.\n");
tunggu (NULL);
printf("Proses anak selesai.\n");

lain
printf("Tidak dapat membuat proses anak.\n");

 
kembali EXIT_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 parent. 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
 
batal tugas anak()
printf("Halo Dunia\n");

 
batal tugas induk()
printf("Tugas utama.\n");

 
int utama(kosong)
pid_t pid = garpu();
 
jika(pid == 0)
tugas anak();
keluar(EXIT_SUCCESS);

else if(pid > 0)
tunggu (NULL);
tugas induk();

lain
printf("Tidak dapat membuat proses anak.");

 
kembali EXIT_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
 
int utama(kosong)
untuk(int i = 1; i <= 5; i++)
pid_t pid = garpu();
 
jika(pid == 0)
printf("Proses turunan => PPID=%d, PID=%d\n", getppid(), getpid());
keluar(0);

lain
printf("Induk proses => PID=%d\n", getpid());
printf("Menunggu proses anak selesai... \n");
tunggu (NULL);
printf("proses anak selesai.\n");


 
kembali EXIT_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
 
int getPIN()
// gunakan PPID dan PID sebagai seed
srand(getpid() + getppid());
int rahasia = 1000 + rand() % 9000;
kembali rahasia;

 
int utama(kosong)
int fd [2];
pipa (fd);
pid_t pid = garpu();
 
jika(pid > 0)
tutup (0);
tutup(fd[1]);
dup(fd[0]);
 
int nomor rahasia;
size_t readBytes = read(fd[0], &secretNumber, sizeof(secretNumber));
 
printf("Menunggu PIN...\n");
tunggu (NULL);
printf("Byte yang dibaca: %ld\n", readBytes);
printf("PIN: %d\n", secretNumber);

lain jika(pid == 0)
tutup(1);
tutup(fd[0]);
dup(fd[1]);
 
int rahasia = getPIN();
tulis(fd[1], &rahasia, ukuran(rahasia));
keluar(EXIT_SUCCESS);

 
kembali EXIT_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.

WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...
Tombol klik kiri mouse tidak berfungsi pada Windows 10
Jika Anda menggunakan mouse khusus dengan laptop, atau komputer desktop, tetapi but tombol klik kiri mouse tidak berfungsi pada Windows 10/8/7 untuk b...
Kursor melompat atau bergerak secara acak saat mengetik di Windows 10
Jika Anda menemukan bahwa kursor mouse Anda melompat atau bergerak sendiri, secara otomatis, acak saat mengetik di laptop atau komputer Windows, maka ...