读《操作系统导论》感悟记录 — Part1 虚拟化(Virtualization)

*本系列只是记录自己读《操作系统导论》时产生的感悟,仅此而已。
如果内容在同一个Part中,则会更新进来*

Part1 — 5 进程接口 Process API

fork()方法

# 书中代码如下
#include 
#include 
#include 
#include 
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.png

你可能感兴趣的:(操作系统,unix,c)