*本系列只是记录自己读《操作系统导论》时产生的感悟,仅此而已。
如果内容在同一个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()
处对应的逻辑地址开始执行,而不是从头开始。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。