Chúng ta biết lời gọi hệ thống fork() dùng để chia một tiến trình thành hai tiến trình. Nếu fork() trả về 0, đó là tiến trình con; ngược lại là tiến trình cha.
Trong ví dụ này, chúng ta sẽ thấy cách tách tiến trình bốn lần và sử dụng chúng theo cách "bottom-up" (từ dưới lên). Đầu tiên, gọi fork() hai lần liên tiếp. Lần đầu tạo tiến trình con, lần thứ hai tạo thêm một tiến trình con khác. Tự động từ fork() bên trong sẽ tạo ra tiến trình cháu.
Hàm wait() được dùng để tạo độ trễ và thực thi các tiến trình theo thứ tự từ dưới lên.
Ví dụ minh họa
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main() {
pid_t id1 = fork(); // Tạo 4 tiến trình bằng hai fork liên tiếp: cha, hai con, một cháu
pid_t id2 = fork();
if (id1 > 0 && id2 > 0) { // Cả hai id khác 0 -> tiến trình cha
wait(NULL);
wait(NULL);
cout << "Ket thuc tien trinh cha" << endl;
} else if (id1 == 0 && id2 > 0) { // id1 = 0 -> con đầu tiên
sleep(2); // Đợi 2 giây để con thứ hai chạy trước
wait(NULL);
cout << "Ket thuc tien trinh con thu nhat" << endl;
} else if (id1 > 0 && id2 == 0) { // id2 = 0 -> con thứ hai
sleep(1); // Đợi 1 giây
cout << "Ket thuc tien trinh con thu hai" << endl;
} else { // Cả hai = 0 -> tiến trình cháu
cout << "Ket thuc tien trinh chau" << endl;
}
return 0;
}
Kết quả
Ket thuc tien trinh chau Ket thuc tien trinh con thu hai Ket thuc tien trinh con thu nhat Ket thuc tien trinh cha