fork函数复制了什么(linux fork 会共享哪些东西)

本文目录
linux fork 会共享哪些东西
fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括:
—全局和局部变量
—打开的文件句柄
—共享内存、消息等同步对象
由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:
假设pipe产生的句柄为P句柄,那么:
—父进程可向自己的P读数据,否则自己写入的数据可能先被自己读走了
—反之亦然,子进程向P读走数据
你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,socket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。
github的fork是什么意思
github的fork是复制、打分支仓库的意思。
例如要Fork一个人的代码仓库,fork操作会复制一份目标仓库(包括文件,提交历史,issues,和其余一些东西),复制后的仓库在你自己的GitHub帐号下,这个操作是在github服务器上完成的,和本地计算机的仓库没有关系。
扩展资料
github的一些常用命令介绍:
1、git init 新建一个空的仓库;
2、git status 查看状态;
3、git add . 添加文件;
4、git mit -m ’注释’ 提交添加的文件并备注说明;
5、git remote add origin git@github:***/git.git 连接远程仓库;
6、git push -u origin master 将本地仓库文件推送到远程仓库;
7、git log 查看变更日志;
8、git reset --hard 版本号前六位 回归到指定版本;
9、git branch 查看分支;
10、git branch newname 创建一个叫newname的分支;
11、git checkout newname 切换到叫newname的分支上;
12、git merge newname 把newname分支合并到当前分支上;
13、git pull origin master 将master分支上的内容拉到本地上。
关于linux下fork()函数的问题
这个和printf 的打印规则有关。
当调用printf时, 打印内容并不一定会实时输出到终端,而是先存到缓冲中,在如下情况之一输出到终端:
1 遇到换行。
2 缓冲区满。
3 遇到flush一类的缓冲刷新函数。
4 退出程序。
这里是第一种和第四种。
对于第一个程序,没换行,所以还在缓冲中, fork的时候 把缓冲中的a也复制了, 这样等程序退出时, 显示了两个。
第二个程序,是遇到\n, 直接输出,缓冲为空。fork的时候, 不会复制这部分。于是只有一个a。
请教linux下关于进程的C程序
此程序的确是执行14次而不是楼主以为的6次,原因如下:
首先,fork函数的工作原理是复制当前进程的资源,另启一个子进程继续执行,子进程中的变量,函数和父进程完全相同,变量值与fork函数执行时父进程变量的当前值相同。
下面解释一下运行结果,
进程3875执行3次循环,输出6次。
进程3875在执行第一次for循环时,产生子进程3876。这时变量i的值是1,因而进程3876的for函数循环两次,生成两个子进程。
进程3876执行2次循环,输出4次。
以此类推,3877执行1次,输出2次。
3880执行1次,输出2次。(这两个进程分别是进程3875第2次循环和进程3876第一次循环产生的子进程,它们创建时i的值都是2,所以只执行1次)。
其他进程for循环判断失败,不执行fork函数。
最后,此程序的输出次数应该是6+4+2+2 = 14次。
解释完毕,希望对楼主有帮助。
fork clone 和 fork 的区别
fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。例如,要是父进程打开了五个文件,那么子进程也有五个打开的文件,而且这些文件的当前读写指针也停在相同的地方。所以,这一步所做的是复制。这样得到的子进程独立于父进程,具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如:pipe,共享内存等机制,另外通过fork创建子进程,需要将上面描述的每种资源都复制一个副本。这样看来,fork是一个开销十分大的系统调用,这些开销并不是所有的情况下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另一个可执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程。但由于现在Linux中是采取了
copy-on-write(COW写时复制)技术,为了降低开销,fork最初并不会真的产生两个不同的拷贝,因为在那个时候,大量的数据其实完全是一样的。写时复制是在推迟真正的数据拷贝。若后来确实发生了写入,那意味着parent和child的数据不一致了,于是产生复制动作,每个进程拿到属于自己的那一份,这样就可以降低系统调用的开销。所以有了写时复制后呢,vfork其实现意义就不大了。
fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子程序,fork函数则返回零,这就是一个函数返回两次的本质。
在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进程的副本。它将获得父进程的数据空间,堆和栈的副本,这些都是副本,父子进程并不共享这部分的内存。也就是说,子进程对父进程中的同名变量进行修改并不会影响其在父进程中的值。但是父子进程又共享一些东西,简单说来就是程序的正文段。正文段存放着由cpu执行的机器指令,通常是read-only的。

更多文章:
setint(PreparedStatement setString与setInt效果是否一样)
2026年7月20日 22:15
spring用英语怎么说(spring怎么读英语 spring英文解释)
2026年2月23日 15:30
property prices(spillover effect是什么意思)
2026年9月23日 18:00
update的过去式和过去分词(Update翻译成汉语是什么意思)
2025年8月29日 13:00
学生eclipse安装教程(哪位大神可以手把手教我怎么在eclipse中安装PHP啊,我是学生,刚刚开始学习,不会装呀..)
2026年7月2日 16:30
进制转换器代码(C语言,使用数组,编写一个十进制正整数转换为二进制数的转换工具)
2025年10月4日 05:30
idea写的代码eclipse能用吗(怎么把Intelij IDEA的工程变为Eclipse工程,希望有人解答)
2025年6月9日 15:00
易语言源代码及模块大全1500(求一个小工具的易语言源代码 悬赏100分)
2026年1月17日 23:15
mmap的实现原理(Android跨进程通信-mmap函数)
2026年5月3日 00:15
















