对于fork概念的简单理解

基本概念

衍生(fork)是Unix编程中最强大的概念之一。fork系统调允许运行中的进程以编程的形式创建新的进程。这个新进程和原始进程一模一样。进行fork操作时,调用fork的进程被称为“父进程”,新创建的进程被称为“子进程”。子进程从父进程处继承了其所占用的内存中的所有内容,以及所有属于父进程的已打开的文件描述符,两个进程共享打开的文件、套接字等。

子进程继承了父进程内存中的所有内容。借助这种方式,一个进程可以将一个500MBde代码库(codebase)装入内存,然后该进程衍生出两个子进程,这些子进程实际上各自享有一份已载入内存代码的副本。子进程可以随意更改其内存内容的副本,而不会对父进程造成任何影响

因为子进程是一个全新的进程,所以拥有自己唯一的pid。子进程的上层进程(parent)显然就是其父进程,因此子进程的ppid就是调用fork的进程的pid。

代码示例

if fork
    puts "enter if block"
else
    puts "enter the else block"
end

执行如上所示的Ruby脚本,将得到如下的输出结果:

entered the if block
entered the else block

通过输出的结果可发现if分支和else分支在脚本执行中均被调用了,似乎有悖常识。但是从进程的角度观察其实不难理解。对于fork方法的调用实际上返回了两次,这是因为fork创造了一个新进程,所以在调用进程(父进程)中返回了一次,在新建进程中又返回了一次。在上述代码中添加pid打印可以更加清晰地了解这一过程。

if fork
    puts "entered the if block from #{Process.pid}"
else
    puts "entered the else block from #{Process.pid}"
end

可观察到输出结果

entered the if block from 398
entered the else block from 399

从观察结果中可知if语句块中的代码是由父进程执行的,而else语句块中的代码是由子进程进行的。这种执行顺序与fork的返回值有关,在子进程中fork返回nil,因为nil为假,所以子进程执行了else语句块中的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值