讀《操做系統導論》感悟記錄 — Part1 虛擬化(Virtualization)

*本系列只是記錄本身讀《操做系統導論》時產生的感悟,僅此而已。
若是內容在同一個Part中,則會更新進來*

Part1 — 5 進程接口 Process API

fork()方法

# 書中代碼以下
#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()處對應的邏輯地址開始執行,而不是從頭開始。
image.pngthis

相關文章
相關標籤/搜索