*本系列只是記錄本身讀《操做系統導論》時產生的感悟,僅此而已。
若是內容在同一個Part中,則會更新進來*
# 書中代碼以下 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main(int argc, char *argv[]) { printf("hello world (pid:%d)\n", (int) getpid()); int rc = fork(); if (rc < 0) { // fork failed; exit fprintf(stderr, "fork failed\n"); exit(1); } else if (rc == 0) { // child (new process) printf("hello, I am child (pid:%d)\n", (int)getpid()); } else { // parent goes down this path (main) int rc\_wait = wait(NULL); printf("hello, I am parent of %d (rc\_wait:%d) (pid:%d)\n",rc, rc\_wait, (int) getpid()); } return 0; }
# 主要看運行結果 hello world (pid:29146) hello, I am child (pid:29147) hello, I am parent of 29147 (pid:29146)
個人理解:
fork()方法在建立進程的各類方法中比較特殊,你能夠理解成是一個「複製分身」操做。假設,進程P1.fork(),那麼會產生一個進程P2,這個進程P2的內容和進程P1如出一轍,惟一不一樣的是,P2佔用的內存空間是獨立的。還有一個特殊之處,一般而言,進程運行老是從邏輯地址0開始的,但fork()出來的進程則不是,由於P2是P1的「複製品」,這意味着P2的程序計數器(pc)與P1的pc如出一轍。因此,P2將會從P1.fork()
處對應的邏輯地址開始執行,而不是從頭開始。
this