Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การใช้ fork() และ wait() สำหรับควบคุมลำดับการทำงานของโปรเซส (Bottom-up) ใน C++

ระบบเรียก 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)