众所周知,Linux创建进程程的时候要调用系统调用fork,fork翻译成中文为“分叉"的意思,真的理解创建进程的过程会发现,fork是很形象的。
先看一段Linux创建进程的代码
1 int main() 2 { 3 pid_t pid=fork(); 4 if(pid<0){ 5 perror("fork()"); 6 exit(1); 7 }else if(pid==0){ 8 //子进程代码 9 10 }else{ 11 //父进程代码 12 } 13 14 }
可以看到,就调用了一下fork程序就被两个分支了。现在想一下如果让你实现fork这个系统调用你会怎么实现,我们知道一个进程控制块能够标志一个进程的存在,那我们很容易能想到,我们在fork内部制作一个深情一个内存,并把进程控制块的各项内容都是填充上,那么一个进程就做好了。想一下我们调用的时候是不是应该传进程控制块里面的各种参数,会非常麻烦。而且有很多参数可能和当前进程都一样,所以Linux的做法是,是完全复制当前进程控制块的内容,然后需要改的内容子进程再自己修改。注意是完全复制,我们知道进程控制块有一项是程序计数器的内容,连这个也需要复制,而这个内容记录的是程序运行的位置。所以我们在看上面代码,代码执行到第三行的时候,父进程当然继续往下执行,因为fork调用一次返回两次,父进程的返回值是大于0的,所以下面的if判断会走到父进程代码的部分,而子进程复制了了一份进程控制块。当进程调度到他的时候他也会从第4行开始执行,由于子进程的的返回值是0,if判断就会进入子进程的代码部分,至此程序流就分开了,因为fork以前的代码都被执行过了,而从后面开始分成两波,就想分了一个叉子一样,所以用fork也就很生动形象了。
标签:fork,调用,代码,pid,关键字,Linux,进程 From: https://www.cnblogs.com/hellosewell/p/16916390.html