首页 > 其他分享 >fork

fork

时间:2023-08-22 12:13:17浏览次数:32  
标签:fork 句柄 pipe 管道 进程 OS

1692676146205

如果我在程序中先进行pipe,创建了一个管道:P,有P[1]与P[2],然后进行fork,那么之后程序会怎么进行,这两个进程中的管道P直接有什么联系和区别?

答案

fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括:
—全局和局部变量
—打开的文件句柄
—共享内存、消息等同步对象

由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:

假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么:
—父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了
—反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据

你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,socket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。

标签:fork,句柄,pipe,管道,进程,OS
From: https://www.cnblogs.com/hi-wind/p/17648213.html

相关文章

  • ForkJoinPool实践
    最近在看一本15年出版的《Java并发编程的艺术》一书,其中看到并发编程时间部分的ForkJoinPool功能时,突然发现这个功能实际使用上就是把一个大任务分成多个小的子任务,然后使用多个线程完成。这个场景跟我之前写过的自定义Java自定义异步功能实践有点异曲同工之妙,只不过这里有有个子......
  • C++中fork函数的使用及原理
    C++中fork函数的使用及原理,在C++中,fork函数用于创建一个新的进程称为子进程,该进程与原始进程几乎完全相同。fork函数的基本概况fork()函数调用成功之后,会有两个返回值。当前进程,也就是父进程返回子进程的pid,子进程返回0。如果函数调用错误,返回为-1。#include<stdio.h>#include......
  • 著名的fork炸弹
    今天突发奇想,想试验下著名的fork炸弹是否真的可以将服务器资源耗尽崩溃,索性拿我个人服务器尝试下吧。先上代码:#!/usr/bin/envpython#encoding:utf-8"""@author:jc@contact:Hurrican@software:PyCharm@file:fork炸弹--只能运行在Linux上@create:2023/7/2010:26......
  • git同步fork仓库同步upstream仓库
    (目录)1.出现问题:[Howtoresolve"gitpull,fatal:unabletoaccess'https://github.com...':Emptyreplyfromserver"gitconfig--global--unsethttp.proxygitconfig--global--unsethttps.proxy2.Giterror:unabletocreatefilexxx:......
  • coc仓库--fork子进程
    fork子进程原函数voidforktest(int*i,pid_tparentid){tesseract::TessBaseAPI*chi_api=newtesseract::TessBaseAPI();if(chi_api->Init("/usr/share/tesseract-ocr/4.00/tessdata/","chi")){fprintf(stderr,"Cou......
  • Xv6 Lab6: Copy-on-Write Fork for xv6
    思路经过lab5:lazypageallocation之后,对xv6的pagefault的处理,算是有所了解了。今天这个COW实验,在2020年的课程视频中有对思路的讲解,可以先看看课程翻译,厘清一下思路。整体思路其实也不难,默认情况下,fokr会调用uvmcopy,将父进程的PP(物理页)复制一份,将这个PP的......
  • Fork&Copy-On-Write
    Fork&Copy-On-WriteFork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于......
  • JUC-ForkJoin
    1,ForkJoin简介ForkJoin是由JDK1.7之后提供的多线程并发处理框架。ForkJoin框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值分解成多个计算,然后将各个计算结果进行汇总。相应的,ForkJoin将复杂的计算当做一个任务,而分解的多个计算则是当做......
  • 一文看懂什么是fork/join
    什么是Fork/JoinFork/Join是JUC并发包下的一个并行处理框架,实现了ExecutorService接口的多线程处理器,它专为那些可以通过递归分解成更细小的任务而设计,最大化的利用多核处理器来提高应用程序的性能。Fork/Join的运行流程大致如下所示:需要注意的是,图里的次级子任务可以一直分......
  • postgresql中fork的含义
    pg_relation_size ( relation regclass [, fork text ])→ bigintComputesthediskspaceusedbyone “fork” ofthespecifiedrelation.(Notethatformostpurposesitismoreconvenienttousethehigher-levelfunctions pg_total_relation_size......