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.