c++中的fork函数_fork函数

c++中的fork函数_fork函数复刻 fork 又译作派生 分支 是 UNIX 或类 UNIX 中的分叉函数 fork 函数将运行着的程序分为 2 个 几乎 完全一样的进程 每个进程都启动一个从代码的同一位置开始执行的线程 这两个进程中的线程继续执行 就像两个用户同时启动了该应用程序的两个副本 从一个软件包拷贝了一份源代码然后在其上进行独立的开发 创建不同的软件 这个术语不只意味着版本控制上的分支 同时也意味着开发者社区的分割 是一种形式的分

复刻(fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分为2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像两个用户同时启动了该应用程序的两个副本。

从一个软件包拷贝了一份源代码然后在其上进行独立的开发,创建不同的软件,这个术语不只意味着版本控制上的分支,同时也意味着开发者社区的分割,是一种形式的分裂。

fork系统调用用于创建一个新进程,成为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程之后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc,相同的CPU寄存器,在父进程中使用的相同打开文件。

它不需要参数并返回一个整数值:

负值:创建子进程失败

零:返回到新创建的子进程

正值:返回到父进程或调用者。该值包含新创建的子进程的进程ID。

分叉函数头文件:

#include/*#包含*/#include/*#包含*/

函数原型:

pid_t fork(void);

(pid_t是一个宏定义,其实质是int被定义在#include中)

返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

函数说明

子进程是父进程的副本,它将获得父进程的数据空间、堆、栈等资源的副本。持有的是上述存储空间的“副本”,意味着父子进程之间不共享这些存储空间。

UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这些依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。

为什么fork会返回两次?

由于在复制时复制了父进程和堆线段,所以两个进程都停留在fork函数中,等待返回。因此fork会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

fork调用的一个奇妙之处就是它仅仅调用一次,却能够返回两次,他可能有三种不同的返回值,可以通过返回值来判断当前进程是子进程还是父进程。

(1)在父进程中,fork返回新创建子进程的ID;

(2)在子进程中,fork返回0;

(3)如果出现错误,fork返回一个负值。

fork函数返回的值为什么在父子进程中不同。其实就相当于链表,进程形成了链表,父进程的函数返回的值指向子进程的进程id,因为子进程没有子进程,所以fork函数返回的值为0;

#include#include#include

int main(int argc,char *argv[]){

pid_t pid=fork();if ( pid < 0) {

fprintf(stderr,”错误!”);

}else if( pid == 0) {

printf(“子进程空间”);

exit(0);

}else{

printf(“父进程空间,子进程pid为%d”,pid);

}//可以使用wait或waitpid函数等待子进程的结束并获取结束状态

exit(0);

}

样例代码存在着父进程在子进程结束前结束的可能性。必要的时候可以使用wait或waitpid函数让父进程等待子进程的结束并获取子进程的返回状态。

fork()在linux系统中的返回值是没有NULL的。

Error Codes

出错返回错误信息如下:

EAGAIN

达到进程数的上限

ENOMEM

没有足够空间给一个新进程分配

fork的另一个特性是所有父进程打开的描述符都被复制到子进程中。父、子进程中相同的编号的文件描述符在内核中指向同一个file结构体,也就是说,file结构体的引用计数要增加。

#include #include#include#include#include

void sys_err(const char *str)

{

perror(str);//将上一个函数发生错误的原因输出到标准设备,参数 s 所指的字符串会先打印出,//后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

exit(1);

}int main(void)

{

pid_t pid;//创建进程利用pid_t类型定义进程号,实际上就是int型

char buf[1024];int fd[2];//文件描述符

char *p = “test for pipe\n”;if (pipe(fd) == -1)//创建管道失败

sys_err(“pipe”);

pid= fork();//创建子进程

if (pid < 0) {

sys_err(“fork err”);

}else if (pid == 0) {

close(fd[1]);//关闭子进程的写端

int len = read(fd[0], buf, sizeof(buf));//读取数据

write(STDOUT_FILENO, buf, len);

close(fd[0]);//关闭读端

} else{

close(fd[0]);//父进程关闭读端

write(fd[1], p, strlen(p));//从写端写入

wait(NULL);//等待子进程结束

close(fd[1]);//关闭写端

}return 0;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207781.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:07
下一篇 2026年3月19日 下午1:07


相关推荐

  • getMethod和getAnnotation「建议收藏」

    getMethod和getAnnotation「建议收藏」1该方法用于取得指定的实体类的实体名称。如果指定的实体类的实体标签定义了名称,则取该名称,否则取类名。例如:有实体类SampleEntityJava代码importjavax.persistence.Entity; @Entity(name=”SpecialName”) publicclassSampleEntity{ …

    2025年12月11日
    3
  • 梯度下降法基本原理

    梯度下降法基本原理求解线性回归模型 函数求极值解析解根据严格的推导和计算得到 是方程的精确解能够在任意精度下满足方程但是在很多情况下 无法直接通过严格的公式推导 得到方程或者方程组的解析解 这时候只能够采用数值分析的方法得到近似解 这样的解也成为数值解数值解通过某种近似计算得到的解能够在给定的精度条件下满足方程我们就都介绍一种常用的求数值解的方法 梯度下降法 为了便于理解 我们先从最简单的一元凸函数开始介绍梯度下降法的求解过程 一元凸函数求极值这是一元函数 fx x 平方 2 的函数曲线

    2026年3月18日
    2
  • java内存模型介绍[通俗易懂]

    java内存模型介绍[通俗易懂]####Java内存模型Java内存模型描述了Java虚拟机和计算机内存之间是如何协同工作的。一个Java虚拟机也是一个完整的计算机的模型,因此,这个模型自然也包含了内存模型。如果你想写出表现良好的并发程序就必须理解Java内存模型。Java内存模型描述了不同线程间如何和何时看到被其他线程修改的共享变量以及在需要时如何同步访问共享变量。原来的Java内存模型存在很多不足,所以在Java5时进行了修改。这个一直使用至今。####Java内存模型每个运行在Java虚拟机中的线程都拥有自己的线程栈。这

    2022年7月8日
    26
  • linux配置vscode python_vscode 配置 python

    linux配置vscode python_vscode 配置 python1.安装python2.安装vscode3.vscode安装所需插件1)、插件名称:python;这个是vscode提供的python官方插件,提供了python代码的调试,自动补全,代码格式化等功能。选择一个Python解释器选择一个Python解释器,在VSCode中,通过打开命令选项板(Ctrl+Shift+P)选择Python3解释器,开始键入…

    2025年6月10日
    4
  • AI_Agents(一)_AI智能体入门

    AI_Agents(一)_AI智能体入门

    2026年3月15日
    2
  • 微信公众号php开发慕课,微信公众平台开发

    微信公众号php开发慕课,微信公众平台开发1 没有计算机课程基础能否学习该课程 可以 只要学习过大学计算机基础等相关知识 是可以学习该课程的 但是学习者若有编程相关基础知识的话 学习起来将会更加轻松 2 课程中涉及很多知识细节 这些内容都要求记住吗 该课程涉及知识细节很多 每个内容若详细介绍都可以是一门课程 但课程的目标是培养学习者的实践能力 不要求学习者对于每一知识细节都死记硬背 学习者只需知道 在具体工程实践中若遇到问题 该如何查找到

    2026年3月18日
    3

发表回复

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

关注全栈程序员社区公众号