`fork()` 是創建子進程的系統調用,而非線程。子進程複製父進程的虛擬地址空間、文件描述符表等,擁有獨立的 PID。
pid_t pid = fork();
if (pid == 0) printf("Hello World\n");
else if (pid > 0) printf("Hello World\n");
else printf("Hello World\n");
正常情況下屏幕輸出兩行「Hello World」(順序不定,取決於調度器)。
`if-else if-else` 結構互斥,每個進程只會進入一個分支。若改為三個獨立 `if`,則父子進程各執行三次,共六次輸出。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
printf("Child: PID=%d, PPID=%d\n", getpid(), getppid());
sleep(30); // 方便用 pstree 觀察
} else if (pid > 0) {
printf("Parent: PID=%d, Child PID=%d\n", getpid(), pid);
wait(NULL);
} else {
perror("fork");
}
return 0;
}
運行後配合 `pstree -p | grep a.out` 可清晰看到父子進程樹結構。