首页 > 系统相关 >Linux创建进程为什么要用fork做为关键字

Linux创建进程为什么要用fork做为关键字

时间:2022-11-22 20:44:57浏览次数:39  
标签:fork 调用 代码 pid 关键字 Linux 进程

众所周知,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

相关文章

  • Linux 下部署 kkFileView
    Linux下部署kkFileViewgitee:kkFileView标签-Gitee.com官网:kkFileView-在线文件预览(keking.cn)在gitee中下载tar包。解压后进入bin目录,执行./install.sh......
  • 【linux基础(三)】Linux命令
    一、Linux命令基本格式命令提示符[root@localhost~]#[]:这是提示符的分隔符号,没有特殊含义。root:显示的是当前的登录用户,笔者现在使用的是root用户登录。@:分隔符号......
  • linux下通过rpath解决cmake动态编译后找不到动态链接库问题
    通过cmake编译链接动态库后,会有一个问题,那就是需要的.so文件不能更改目录,一旦.so文件目录变了,整个程序就没法运行了,这肯定是不行的。原因后来我查一下一下,linux系统中,......
  • Linux C编程 使用相对路径加载动态库-rpath和$ORIGIN
    商业程序如何加载自己的so使用LD_LIBRARY_PATH的缺点是要实现设置LD_LIBRARY_PATH。不够自动化。那么大型的商业程序是如何加载自己的so呢。这里以QtCreator为例。QtC......
  • 【linux基础(二)】Linux文件(目录)命名规则
    在Linux系统中,一切都是文件,既然是文件,就必须要有文件名。同其他系统相比,Linux操作系统对文件或目录命名的要求相对比较宽松。Linux系统中,文件和目录的命名规则如下:除......
  • chroot恢复Arch Linux
    这篇速成指南诠释了一些步骤,它对于恢复一个Arch ​​Linux 安装很有帮助。作为一个滚动发布版本,ArchLinux有时会崩溃。那不是你自身的问题,而是因为数百个其它的原因,例......
  • 中科大嵌入式linux课程笔记01
    lesson1嵌入式系统主要概念课程简介课程目录参考书嵌入式系统结构和开发流程概念、特点、组成、硬件、软件、开发​ 嵌入式系统首先是一个计算机系统,后者有的技......
  • Linux 安装Docker 一键脚本执行
    sudoyumremovedocker*sudoyuminstall-yyum-utils#配置docker的yum地址sudoyum-config-manager\--add-repo\http://mirrors.aliyun.com/docker-ce/linux/c......
  • linux上部署皕杰报表小结
    最近需要在一个服务器上部署皕杰报表,连接的是mysql的库。步骤如下:1.首先先下载jdk,配置相应的Java环境。2.下载mysql,上官网下载相应的rpm包。3.安装好mysql后,使用dbeaver工具......
  • linux中已启动tomcat,网页无法访问
    使用./catalina.shrun提示以下错误:  在/home目录下并没有找到jre的相关目录解决:在/etc/profile中将jre_home=$JAVA_HOME然后source/etc/profile,就可以了......