父进程和子进程关于数据和文件描述符的继承的理解

摘要:
但是,应该注意,在父进程中打开的文件也将在子进程中打开,继承打开的文件描述符,但子进程与父进程共享文件表。因此,一个进程的文件偏移量的更改将直接影响另一个进程。详情如下。如果父进程和子进程写入相同的文件描述符,但没有任何形式的同步,则它们的输出将是混合的。在这种情况下,在分叉之后,父进程和子进程分别关闭它们不需要使用的文件描述符,这样它们就不会干扰彼此使用的文件描述符。

    用fork()函数建立的子进程几乎与父进程完全一样,子进程中的所有变量均保持他们在父进程中的值(当然fork的返回值除外),因为自己称可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间(当然逻辑地址可能是一样的),这就保证了在一个进程中的变量数据变化不会影响到另外一个进程。这一点非常重要。

    但是有一点要特别注意的,在父进程打开的文件,那么在子进程中也会打开,继承了打开的文件描述符,但是子进程与父进程共享文件表,所以有一个进程中的文件偏移量发生变化就会直接影响到另外一个进程,详细解释如下。

父进程和子进程关于数据和文件描述符的继承的理解第1张

    从图3-1我们可以知道,对于每个进程都有对打开的文件的记录表,其中每个记录项都记录着每个文件描述符的信息,通过该记录项的我们就可以文件表的指针,我们就可以在文件表中找到相对应的文件表项,每个文件表项记录着打开的该文件的状态以及当前文件的偏移量信息。当我们在父进程中建立一个子进程,那么现在的打开文件的结构图如8-1所示:(注:此图粘贴自http://blog.csdn.net/caigen1988/article/details/7736565

父进程和子进程关于数据和文件描述符的继承的理解第2张

     那么从中可以看出,虽然在子进程的表项中是复制了关于打开文件的信息,但是他们是共享文件表的,所以如果一个进程对文件指针进行移动,那么肯定会影响到另外的进程。

如果父、子进程写到同一个文件描述符,但有没有任何形式的同步,那么它们的输出就会相互混合。在fork之后处理文件描述符有两种常见的情况:

(1)父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量已经执行了相应的更新。

(2)父、子进程各自执行不同的程序段。这种情况下,在fork之后,父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符。这种方式是网络服务进程中常用的方式。

免责声明:文章转载自《父进程和子进程关于数据和文件描述符的继承的理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FP16C# winform 多线程异步操作线程启动暂停与恢复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

《Unix/Linux系统编程》第八章学习笔记

第八章 使用系统调用进行文件操作 8.1系统调用 在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称Kmode和 Umode。在Umode中,进程的权限非常有限。它不能执行任何需要特殊权限的操作。特殊权限的操作必须在Kmode下执行。系统调用(简称syscall)是一种允许进程进入Kmode以执行Umode不允许操作的机制。复刻子进程、修改...

Nginx使用教程(二):Nginx配置性能优化之worker配置

配置Nginx workers <br>NGINX根据指定的配置运行固定数量的工作进程。 这些工作进程负责处理所有处理。 在下面的章节中,我们将调整NGINX worker参数。 这些参数是NGINX全局上下文的一部分。 worker_processes worker_processes指令控制工作进程数: worker_processes 1...

IOS开发-GitHub使用详解

1、GitHub是什么? GitHub这个名词既可以是那个流行的代码分享和协作网站 https://github.com/,也可以是指Git客户端工具(与其他的Git客户端工具如GitEye类似,只不过Git仓库托管在GitHub服务器上)。下图即GitHub客户端截图,我已经在GitHub上建立了两个Git仓库(Git仓库地址类似https://gi...

linux shell脚本编程笔记(五): 重定向

I/O重定向 简述: 默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重定向. 对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者甚至是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令,...

多进程侦听同一端口

一、端口侦听我们知道,系统中的互联网端口地址是系统级唯一的,在默认情况下,IPV4和IPV6的同一个协议的套接口也不能再同一个端口侦听,而套接口编程的五元组就是<IP,port,peerip,peerport,inet proto>,其中没有进程区分,所以一个系统的套接口对于同一个网络地址来说是唯一的。但是有时候为了实现负载平衡,可能希望有多个...

pm2用法详解+ecosystem.config

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除no...