Linux fork函数理解

Linux fork函数理解验证 1 fork 会重新拷贝父进程的一份资源例如 环境变量 公共结构代码地址 https code csdn net snippets git wang localhost fork a

大家好,欢迎来到IT知识分享网。

验证1 fork会重新拷贝父进程的一份资源

例如 环境变量 公共结构

代码地址:

https://code.csdn.net/snippets/.git

[wang@localhost fork]$ ./a.out

ptr index=0 value= 1

ptr index=1 value= 2

ptr index=2 value= 0

child pid = 25994, glob_int = 2 ptr=0x1c26010,

ptr index=0 value= 3

ptr index=1 value= 4

ptr index=2 value= 0

parent pid = 25993, glob_int = 1 ptr=0x1c26010,

Q1 为什么父子进程打印的ptr地址是一样的

A1:

现象如下父进程malloc的指针指向0x, fork 后,子进程中的指针也是指向0x,但是这两个地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。

所以两个进程中的这两个地址相互之间没有任何关系

(注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父子进程之间的独立性)

(注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 技术,fork后,这两个虚拟地址实际上指向相同的物理地址(内存页),只有任何一个进程试图修改这个虚拟地址里的内容前,两个虚拟地址才会指向不同的物理地址(新的物理地址的内容从原物理地址中复制得到))

虚拟地址里映射到真实的物理地址

验证2 共享数据块

fork 之后 父子进程之间什么样的数据是相同的?

  • fork之后父子进程共享文件表的同一项
  • A B进程操作外界资源 虽然是2个入口但是同一份数据 一方修改会影响另外一方

    例如

    为了提高性能、降低数据库连接消耗,openboss采用DBPool来管理数据库连接且DBPool为全局变量,所以当子进程退出时会调用DBPool的析构函数,DBPool的析构函数会执行断开数据库连接的操作

验证3 共享内存是进程本身的资源吗?

不是

共享内存有持续性: 随内核,

即进程重启共享内存中数据不会丢失

本身不具备协作能力 需要互斥锁 信号量等完成

http://blog.csdn.net/xy0/article/details/

http://blog.csdn.net/cywosp/article/details/

http://blog.csdn.net/ordeder/article/details/

http://blog.csdn.net/sunmenggmail/article/details/

http://www.cnblogs.com/zhaoyl/p/3695517.html

http://blog.csdn.net/liuhongxiangm/article/details/

Linux fork函数理解

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/183819.html

(0)
上一篇 2025-07-22 08:00
下一篇 2025-07-22 08:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信