*本系列只是记录本身读《操做系统导论》时产生的感悟,仅此而已。
若是内容在同一个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