#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h> // สำหรับใช้ฟังก์ชัน wait()
int main( ) {
pid_t pid;
// สร้างกระบวนการย่อยตัวที่ 1
pid = fork( ) ;
if ( pid < 0 ) {
// ถ้าการ fork ล้มเหลว
return 1 ;
} else if ( pid == 0 ) {
// นี่คือโค้ดที่กระบวนการย่อยตัวที่ 1 จะทำงาน
printf ( "Child 1: Process ID - %d, Parent ID - %d\n " , getpid
( ) , getppid
( ) ) ; printf ( "Child 1: Finished work.\n " ) ; return 0 ;
}
// สร้างกระบวนการย่อยตัวที่ 2
pid = fork( ) ;
if ( pid < 0 ) {
// ถ้าการ fork ล้มเหลว
return 1 ;
} else if ( pid == 0 ) {
// นี่คือโค้ดที่กระบวนการย่อยตัวที่ 2 จะทำงาน
printf ( "Child 2: Process ID - %d, Parent ID - %d\n " , getpid
( ) , getppid
( ) ) ; printf ( "Child 2: Finished work.\n " ) ; return 0 ;
}
// โค้ดนี้จะทำงานในกระบวนการหลักเท่านั้น
printf ( "Parent: Process ID - %d\n " , getpid
( ) ) ; printf ( "Parent: Doing some work...\n " ) ;
// รอให้กระบวนการย่อยทั้งสองสิ้นสุดการทำงาน
wait( NULL) ; // รอ child process ตัวแรก
wait( NULL) ; // รอ child process ตัวที่สอง
printf ( "Parent: All child processes have finished. Now parent finishes.\n " ) ; return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+ICAvLyDguKrguLPguKvguKPguLHguJrguYPguIrguYnguJ/guLHguIfguIHguYzguIrguLHguJkgd2FpdCgpCgppbnQgbWFpbigpIHsKICAgIHBpZF90IHBpZDsKCiAgICAvLyDguKrguKPguYnguLLguIfguIHguKPguLDguJrguKfguJnguIHguLLguKPguKLguYjguK3guKLguJXguLHguKfguJfguLXguYggMQogICAgcGlkID0gZm9yaygpOwogICAgaWYgKHBpZCA8IDApIHsKICAgICAgICAvLyDguJbguYnguLLguIHguLLguKMgZm9yayDguKXguYnguKHguYDguKvguKXguKcKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZvcmsgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0gZWxzZSBpZiAocGlkID09IDApIHsKICAgICAgICAvLyDguJnguLXguYjguITguLfguK3guYLguITguYnguJTguJfguLXguYjguIHguKPguLDguJrguKfguJnguIHguLLguKPguKLguYjguK3guKLguJXguLHguKfguJfguLXguYggMSDguIjguLDguJfguLPguIfguLLguJkKICAgICAgICBwcmludGYoIkNoaWxkIDE6IFByb2Nlc3MgSUQgLSAlZCwgUGFyZW50IElEIC0gJWRcbiIsIGdldHBpZCgpLCBnZXRwcGlkKCkpOwogICAgICAgIHByaW50ZigiQ2hpbGQgMTogRmluaXNoZWQgd29yay5cbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIOC4quC4o+C5ieC4suC4h+C4geC4o+C4sOC4muC4p+C4meC4geC4suC4o+C4ouC5iOC4reC4ouC4leC4seC4p+C4l+C4teC5iCAyCiAgICBwaWQgPSBmb3JrKCk7CiAgICBpZiAocGlkIDwgMCkgewogICAgICAgIC8vIOC4luC5ieC4suC4geC4suC4oyBmb3JrIOC4peC5ieC4oeC5gOC4q+C4peC4pwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRm9yayBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIGlmIChwaWQgPT0gMCkgewogICAgICAgIC8vIOC4meC4teC5iOC4hOC4t+C4reC5guC4hOC5ieC4lOC4l+C4teC5iOC4geC4o+C4sOC4muC4p+C4meC4geC4suC4o+C4ouC5iOC4reC4ouC4leC4seC4p+C4l+C4teC5iCAyIOC4iOC4sOC4l+C4s+C4h+C4suC4mQogICAgICAgIHByaW50ZigiQ2hpbGQgMjogUHJvY2VzcyBJRCAtICVkLCBQYXJlbnQgSUQgLSAlZFxuIiwgZ2V0cGlkKCksIGdldHBwaWQoKSk7CiAgICAgICAgcHJpbnRmKCJDaGlsZCAyOiBGaW5pc2hlZCB3b3JrLlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8g4LmC4LiE4LmJ4LiU4LiZ4Li14LmJ4LiI4Liw4LiX4Liz4LiH4Liy4LiZ4LmD4LiZ4LiB4Lij4Liw4Lia4Lin4LiZ4LiB4Liy4Lij4Lir4Lil4Lix4LiB4LmA4LiX4LmI4Liy4LiZ4Lix4LmJ4LiZCiAgICBwcmludGYoIlBhcmVudDogUHJvY2VzcyBJRCAtICVkXG4iLCBnZXRwaWQoKSk7CiAgICBwcmludGYoIlBhcmVudDogRG9pbmcgc29tZSB3b3JrLi4uXG4iKTsKCiAgICAvLyDguKPguK3guYPguKvguYnguIHguKPguLDguJrguKfguJnguIHguLLguKPguKLguYjguK3guKLguJfguLHguYnguIfguKrguK3guIfguKrguLTguYnguJnguKrguLjguJTguIHguLLguKPguJfguLPguIfguLLguJkKICAgIHdhaXQoTlVMTCk7ICAvLyDguKPguK0gY2hpbGQgcHJvY2VzcyDguJXguLHguKfguYHguKPguIEKICAgIHdhaXQoTlVMTCk7ICAvLyDguKPguK0gY2hpbGQgcHJvY2VzcyDguJXguLHguKfguJfguLXguYjguKrguK3guIcKCiAgICBwcmludGYoIlBhcmVudDogQWxsIGNoaWxkIHByb2Nlc3NlcyBoYXZlIGZpbmlzaGVkLiBOb3cgcGFyZW50IGZpbmlzaGVzLlxuIik7CiAgICByZXR1cm4gMDsKfQo=