ระบบเรียก fork() ใช้สร้างโปรเซสใหม่ (child process) จากโปรเซสเดิม (parent process) โดยคืนค่า 0 ให้โปรเซสลูก และคืนค่า PID ของลูกให้โปรเซสแม่
หลักการทำงานแบบ Bottom-up
ตัวอย่างนี้สาธิตการสร้างโปรเซส 4 ตัว (1 แม่, 2 ลูก, 1 หลาน) และใช้ wait() ร่วมกับ sleep() เพื่อควบคุมให้โปรเซสทำงานเสร็จตามลำดับจากใต้ขึ้นบน (grandchild → children → parent)
ตัวอย่างโค้ด
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main() {
// เรียก fork() 2 ครั้งติดต่อกัน -> ได้ 4 โปรเซส
pid_t id1 = fork();
pid_t id2 = fork();
// กรณี: โปรเซสแม่ (ทั้ง id1 และ id2 ไม่เป็น 0)
if (id1 > 0 && id2 > 0) {
wait(NULL); // รอลูกคนแรก
wait(NULL); // รอลูกคนที่สอง
cout << "จบการทำงานของโปรเซสแม่" << endl;
}
// กรณี: ลูกคนแรก (id1 == 0, id2 > 0)
else if (id1 == 0 && id2 > 0) {
sleep(2); // หน่วงเวลา ให้ลูกคนที่ 2 ทำงานก่อน
wait(NULL); // รอหลาน
cout << "จบการทำงานของลูกคนแรก" << endl;
}
// กรณี: ลูกคนที่สอง (id1 > 0, id2 == 0)
else if (id1 > 0 && id2 == 0) {
sleep(1); // หน่วงเวลา น้อยกว่าลูกคนแรก
cout << "จบการทำงานของลูกคนที่สอง" << endl;
}
// กรณี: หลาน (ทั้ง id1 และ id2 เป็น 0)
else {
cout << "จบการทำงานของหลาน" << endl;
}
return 0;
}
ผลลัพธ์
จบการทำงานของหลาน จบการทำงานของลูกคนที่สอง จบการทำงานของลูกคนแรก จบการทำงานของโปรเซสแม่
คำอธิบายเพิ่มเติม
wait(NULL)ทำให้โปรเซสแม่หยุดรอจนกว่าโปรเซสลูกจะจบsleep()ใช้สร้างความล่าช้าเพื่อควบคุมลำดับการแสดงผล (ไม่ใช่การซิงโครไนซ์จริง)- ในระบบจริงควรใช้กลไกซิงโครไนซ์ที่เหมาะสม เช่น semaphore หรือ condition variable
โครงสร้างโปรเซส
Parent (PID: x) ├── Child 1 (PID: y) │ └── Grandchild (PID: z) └── Child 2 (PID: w)