学习
实践
活动
工具
TVP
写文章

fork函数简介_fork()&&fork()

fork函数简介 fork函数的两次返回和父子进程的执行顺序简介 fork()子进程与父进程之间的文件描述符问题 [cpp] view plaincopyprint? fork函数的两次返回和父子进程的执行顺序简介 大家都知道,调用fork后会返回两个值或者一个值。 fork()是一个经过封装的用户态函数,当用户程序调用了fork函数之后,执行系统调用sys_fork(),而在sys_fork()中直接调用了do_fork()函数,在do_fork()函数中有6个参数 也就是说真正的创建进程实在do_fork函数中实现的,其实向vfork,pthread_creat也都是最终调用的do_fork函数,do_fork函数对调用它的函数的区别是通过clone_flags标志来实现的 ,fork返回一个负值;   在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。

8520

fork函数

fork fork)是UNIX或类UNIX中的分叉函数fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。 ,子进程返回0,父进程返回子进程ID;否则,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程。 由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。 ? 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。 其实就相当于链表,进程形成了链表,父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.

50120
  • 广告
    关闭

    腾讯云精选爆品盛惠抢购

    腾讯云精选爆款云服务器限时体验20元起,云数据库19.9元/年起,还有更多热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    进程fork函数

    ; /* on .data section */ int* ptr= new int[3]; [wang@localhost fork]$ . (注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父子进程之间的独立性) (注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 验证2 共享数据块 fork 之后 父子进程之间什么样的数据是相同的? fork之后父子进程共享文件表的同一项 ? 个入口但是同一份数据 一方修改会影响另外一方 例如 为了提高性能、降低数据库连接消耗,openboss采用DBPool来管理数据库连接且DBPool为全局变量,所以当子进程退出时会调用DBPool的析构函数 ,DBPool的析构函数会执行断开数据库连接的操作 验证3 共享内存是进程本身的资源吗?

    66280

    linux fork函数浅析

    函数被调用一次,但返回两次。两次返回的差别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。 将子进程id返回给父进程的理由是:由于一个进程的子进程能够多于一个,没有一个函数使一个进程能够获得其全部子进程的进程id。 ,指令指针也全然同样,子进程拥有父进程当前执行到的位置(两进程的程序计数器pc值同样,也就是说,子进程是从fork返回处開始执行的),但有一点不同,假设fork成功,子进程中fork的返回值是0,父进程中 fork的返回值是子进程的进程号,假设fork不成功,父进程会返回错误。 这也是fork为什么叫fork的原因 至于那一个最先执行,可能与操作系统(调度算法)有关,并且这个问题在实际应用中并不重要,假设须要父子进程协同,能够通过原语的办法解决。

    6520

    浅析fork函数、exec函数和pthread函数

    1、fork函数,exec函数和pthread函数的机理 在linux中,每个进程都使用一个唯一的整数形式的进程标识符来标识。 1.1 fork() Fork()函数是创建新进程的函数,即通过fork()系统调用,可创建新进程。新进程复制原来进程的地址空间,这种机制允许父子进程之间相互通信。 两个进程都继续执行系统调用fork()函数之后的指令。但是不同的是,对于新创建的进程,系统调用fork()之后的返回值为0,对于原来的父进程,返回值大于0,如果创建新进程失败,则返回一个负值。 Exec()函数一般用于系统调用fork()函数之后,新进程会使用exec()函数来代替父进程的内存空间系统通过调用exec()函数将二进制文件装入内存,并开始执行。 之后主函数使用fork()函数创建新进程,新进程和原进程使用相同的内存,子进程的代码段、数据段、堆栈都是指向父进程的物理空间。

    8310

    translate函数用法_fork函数在循环体中

    TranslateMessage函数 函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。 例如,如果TranslateAccelerator函数返回一个非零值,则应用程序将不调用TranslateMessage函数。 TranslateMessage函数只能用于转换由GetMessage或PeekMessage函数接收到的消息。 DispatchMessage函数 函数功能:该函数调度一个消息给窗口程序。 消息被调度到的窗口程序即是MainProc()函数。    总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理. 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    5310

    深入解读Linux进程函数fork(),vfork(),execX()

    本文研究的主要是Linux进程函数fork(),vfork(),execX()的相关内容,具体介绍如下。 函数fork() fork函数:创建一个新进程 1、fork()成功后,将为子进程申请PCB和用户内存空间。 函数vfork() 与fork()函数不同,vfork()函数在创建进程是并不复制父进程的地址空间,而是在必要的时候才申请新的存储空间,因此使得vfork()更有效率。 /fork child:i=11 parent:i=10 如果改为vfork(),则: child:i=11 parent:i=11 函数exec X()系列函数fork()函数创建紫禁城后 ,如果希望在当前子进程中运行新的程序,则可以调用execX系列函数

    60752

    linux中fork()函数详解(原创!!实例讲解)

    函数的特性有关。 3)如果出现错误,fork返回一个负值;     在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。 在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。 函数返回的值 //printf("fork!") 大家看了这么多可能有点疲倦吧,不过我还得贴最后一份代码来进一步分析fork函数

    2.5K30

    linux系统编程之进程(二):fork函数相关总结

    一、fork系统调用 包含头文件 <sys/types.h> 和 <unistd.h> 函数功能:创建一个子进程 函数原型          pid_t  fork(void); 参数:无参数。 系统调用需要注意的地方 fork系统调用之后,父子进程将交替执行。 子进程退出会发送SIGCHLD信号给父进程,可以选择忽略或使用信号处理函数接收处理就可以避免僵尸进程。 (5)、fork之后父子进程共享文件 ? 子进程继承了父进程打开的文件描述符,故每个打开文件的引用计数为2。 /process_fork  before fork pid=2572 this is parent parent pid=2572 child pid=2573 this is child

    1.5K60

    UnixLinux fork前传

    本文是《Linux fork那些隐藏的开销》的前传。 fork的由来 fork的思想在UNIX出现几年前就出现了,时间大概是1963年,这比UNIX在PDP-7上的第一个版本早了6年。 比如Java Thread的join方法以及pthread库的pthread_join函数。 广义来讲,join也表示诸如临界区等必须串行通过的点, 减少join点的数量将会提高并行的效率。 截止目前,我们看到的表象是: 汤普森版UNIX没有fork,没有exec,没有wait,仅有的库函数般的exit也和现在的exit系统调用大相径庭,显然汤普森版UNIX并非一个多进程系统,而只是一个可以跑的简陋的两终端分时系统 UNIX fork的诞生 fork是如何引入UNIX的呢? fork是让你来分解程序流程得以并行处理的。 UNIX fork就此诞生!

    7320

    UnixLinux fork前传

    本文是《Linux fork那些隐藏的开销》的前传。 fork的由来 fork的思想在UNIX出现几年前就出现了,时间大概是1963年,这比UNIX在PDP-7上的第一个版本早了6年。 比如Java Thread的join方法以及pthread库的pthread_join函数。 广义来讲,join也表示诸如临界区等必须串行通过的点, 减少join点的数量将会提高并行的效率。 如果你熟悉Linux内核execve系统调用加载ELF可执行文件的逻辑,你会发现,对于ELF文件而言,这里所谓的bootstrap其实就是load_elf_binary函数。 截止目前,我们看到的表象是: 汤普森版UNIX没有fork,没有exec,没有wait,仅有的库函数般的exit也和现在的exit系统调用大相径庭,显然汤普森版UNIX并非一个多进程系统,而只是一个可以跑的简陋的两终端分时系统 取了个巧,奇技淫巧: fork本来就不是让你用来覆盖新进程的,不然为何多此一举。fork是让你来分解程序流程得以并行处理的。 UNIX fork就此诞生!

    46332

    内核线程的fork与普通的fork的区别

    在网络上,很多关于fork的文章都大同小异,讲的都是很通用的fork的原理以及大致的过程。但是,大家有没有想过一个问题:用户程序调用fork()和内核下调用fork(),背后的逻辑是不一样的。 然后在fork系统调用的函数里面,操作系统将会初始化pcb、线程结构体、对用户空间的内存的拷贝,最后把子进程加入调度队列。 这里“内存拷贝”这一点就是关键所在,也是众多文章没有提及的部分。 内核态进程的fork和用户进程的fork是相同的。 内核线程的fork 讲了这么久,这才轮到我们的主角:内核线程。内核线程的fork的过程与前面提到的两者是不同的。 首先,我们需要认识一下内核线程。 首先我们需要理解栈帧的结构: 当发生函数调用时,处理器会把当前当前函数的返回地址、栈基址寄存器的值压入栈中。返回地址指的是,被调用的函数返回时,将会从哪个位置开始执行。 返回到enter_syscall_int()函数内的时候,rsp寄存器的值 new_regs->rsp = new_top - (old_top - new_regs->rsp); return

    6710

    进程 (一).fork(2)

    ,sleep,getpid,getppid 原型 在 unistd.h 中包含 fork,sleep,getpid,getppid 的函数原型 /* Clone the calling process, 和 vfork 在 unistd.h 中包含 fork,vfork 的函数原型 /* Clone the calling process, creating an exact copy. int *__stat_loc, int __options); 从上面的描述可以知道 wait(&status) 相当于 waitpid(-1,&status,0) 实际上Linux 内部在实现wait函数时直接调用的就是 waitpid函数 status 是用来存放返回值的,一般不是直接使用,而是通过宏来进行解析,例如 WEXITSTATUS(status) 在 stdlib.h 头文件中有如下定义 /* Define fork waitpid/wait 通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础 原文地址http://soft.dog/2017/01/09/c-fork-01/

    16650

    fork-join挺好用的了,fork-join_any、fork-join_none有什么用?

    那就是fork-join_any和fork-join_none!!! 这三个兄弟虽然长的比较像,但是其实性格是不一样的!他们的主要性格区别是他们对待称为“线程”的小朋友的态度上。 那fork-join_any、fork-join_none一个健忘症一个暴脾气,他们是猴子请来搞笑的吗?除了增加我们的概念记忆还有什么作用? ? 这时对于fork-join_any这个健忘症,就可以有用武之地了。 这里面的for循环就是我们前面提到的“组长”,如果没有fork-join_any,单纯的使用fork-join便会一直停不下来,是不能实现这个功能的了。 ? 值得一提的是,这两段代码作用其实是不等价的,通过fork-join_none运行的100个线程,是并行启动了,但是不等他们全部结束程序就会进行到后面的程序中去,如果想要等价可以在后面使用wait fork

    42820

    Linux的fork使用

    Linux的fork使用 fork函数可以算是Linux里有点不好明白的函数了,调用一次,返回两次,虽然在平时的写法中,有基本固定的写法,但是有时候看起来还是有些让人头疼的。 这里就把关于fork函数好好整理一下 函数介绍 功能:fork函数是从一个已经存在的进程中创建一个新的进程,新的进程称为子进程,原来的进程称为父进程。 失败 cout<<"fork失败"<<endl; } } 从上面的例子可以看出,fork函数会有两个返回值,一个是在子进程中返回0,一个是在父进程中返回子进程的pid。 fork进程的原理 使用 fork() 函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间:包括进程上下文(进程执行活动全过程的静态描述)、进程堆栈、打开的文件描述符、信号控制设定 因此,使用 fork()函数的代价是很大的。 ? 日常使用fork 简单来说, 一个进程调用 fork() 函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。

    1.8K41

    玩转 GitHub 更新Fork

    在GitHub上更新Fork 经常遇到的是Fork一个项目之后,源项目的作者做了新的更改,如果没有同步到我自己的Fork,我所做的更新进行Pull Request后,会产生冲突;因此在更新文件之前、至少是 Pull Request之前,应当要更新自己的Fork的。 二、如果自己还没有修改过Fork项目的文件,那么此时可以点击switching the base,切换到基于我自己的Fork项目。 ? 如果已经修改或更新过Fork项目的文件,那么可以通过选择Base Fork和Head Fork来从源项目更新到我自己的Fork项目。 ? ? Fork一下咯! ? 点击Fork,会进入Fork进行中的界面; ? Fork完成后,可以在自己的主页(Your Profile)看到Fork的项目。 ?

    2K10

    Linux多进程(fork)

    进程概念: 一个进程是一次程序执行的过程,它和程序不同,程序是静态的,它是一些保存在磁盘上可执行的代码和数据的集合,而进程是一个动态概念,也是操作系统分配资源的最小单位 fork和exec是两个重要的系统调用 ,fork的作用是根据现有的进程复制出一个新的进程,原来的进程称为父进程,新的进程成为子进程, 系统中运行着很多进程,这些进程都是从开始的一个进程一个一个复制出来的。 #include <sys/type.h> #include <unistd.h> pid_t fork(void); fork调用失败返回-1,调用成功在父子进程中的返回值不一样,子进程中返回0,父进程中返回的数值大于 0 #include <sys/types.h> //基本系统数据类型的头文件 #include <unistd.h> //包含了许多UNIX系统服务的函数原型 getpid函数 #include <stdio.h > //输入输出函数 int main(void){ pid_t pid; char * message; int n; pid = fork(); if(pid

    77330

    扫码关注腾讯云开发者

    领取腾讯云代金券