Linux下fork函数详解

本文详细介绍了Linux中的fork函数,阐述了进程的概念,包括进程的上下文交换和组成元素。重点讲解了fork函数创建子进程的过程,强调了父子进程在数据空间、文件描述符共享方面的特性。通过示例代码展示了fork函数的使用,解释了不同情况下printf的输出行为,并分析了父子进程关闭文件描述符的影响。
摘要由CSDN通过智能技术生成

1. 进程的概念

进程可以理解为程序的一次执行过程。每一个特定的时候只有一个进程占用CPU。

当一个进程的时间片用完后,系统把相关的寄存器的值保存到该进程表相应的表项里。同时把代替该进程即将执行的进程的上下文从进程表中读出,并更新相应的寄存器值,这个过程称为上下文交换。

上下文交换其实就是读出新的进程的PC(程序计数器),指示当前进程的下一条将要执行的指令。

 

一个进程主要包含以下三个元素:

(1)一个正在执行的程序

(2)与该进程相关联的全部数据(变量,内存,缓冲区)

(3)程序上下文(程序计数器)

 

2. pid=fork()的创建过程

 

fork()函数是用来创建子进程的,当一个程序创建了一个子进程,那么原先的进程称为该子进程的父进程。操作系统的进程表的每个表项中存放着一个进程的情况。首先,操作系统在进程表中为该进程建立新的表项。子进程与父进程共享代码段,但数据空间是相互独立的。子进程数据空间的内容是父进程的完整拷贝,上下文也完全相同。pid在父进程与子进程的返回值是不同的,如果pid<0创建失败。在子进程中返回的pid=0,因为子进程可以通过getpid()得到自己的进程ID。在父进程中返回的是子进程的实际的PID。子进程是从fork()之后执行的,此时,父进程与子进程就fork(分道扬镳)了。

 

注意:

(1)子进程copy父进程的变量,内存与缓冲区,即整个的数据空间的内容,但数据空间是独立的。

(2)父子进程对打开文件的共享: fork之后,子进程会继承父进程所打开的文件表,即父子进程共享文件表,该文件表是由内核维护的,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值