复刻(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;

}

c++中的fork函数_fork函数相关推荐

  1. c++中的fork函数_fork( )函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  2. fork()函数_fork()函数的使用

    fork的意思是个叉子,在unix及其衍生版Linux中,用于创建子进程,现在看一下fork函数的基本用法. #include<stdio.h> #include<stdlib.h& ...

  3. Linux中的fork()和clone()函数

    原文地址:https://blog.csdn.net/qq_42837885/article/details/101950162 fork函数 在linux中fork函数是非常重要的函数,它从已存在进 ...

  4. java fork菜鸟_fork()函数的简单例子

    1.fork()函数 fork()是一个系统调用,用于创建进程.创建的这个进程与原来进程几乎完全相同.这个新产生的进程称为子进程.一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据 ...

  5. linux中的fork函数详解

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程.在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID.我们可以通过fork返回的值来 ...

  6. 转:linux中fork()函数详解

    转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...

  7. linux中fork()函数具体解释(原创!!实例解说)

     一.fork入门知识 一个进程,包含代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程差点儿全然同样的进程,也就是两个进程能够做全然同样的事,但假设初始參数或者传入的变量不 ...

  8. c++中的fork函数_linux c语言 fork() 和 exec 函数的简介和用法

    linux c语言 fork() 和 exec 函数的简介和用法 假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<stdli ...

  9. 对于\n冲刷缓冲区,对Linux中fork()函数的理解

    首先今天写了两道感觉一模一样的fork题目,都是输出_的,结果一个题目输出8个_,一个题目输出6个_,我看了许久,才发现一点点的不同,于是去Linux系统下自己编译了两个cpp文件,果然,现在贴上图: ...

最新文章

  1. reg型变量怎么赋值_UiPath变量的介绍和使用
  2. 【sprinb-boot】HttpServletResponse设置HTTP缓存
  3. 数据分析数据拼接案例
  4. closewait一直不释放_夏至太阳庆典 || 巨蟹座日蚀新月大释放蜡烛魔法仪式(寻找新的幸运儿)...
  5. Python基础语法毕业笔记-最简单的添加删除程序
  6. Numpy 之 copies and Views
  7. 关于snowflake算法的几个问题
  8. java将a对象转换为b对象_Java 对象的深复制五种方式
  9. Linux SD卡建立两个分区
  10. 美化博客园 添加网易云音乐及生成文章目录
  11. Linux上安装GCC编译器过程实录
  12. 张正友标定数学原理推导
  13. C语言结构体(Struct)——摘自C语言学习网
  14. 前端如何实现文件下载(七种方法)
  15. XMU毕业生总结写paper常用网站
  16. python计算球体体积_鬼斧神工:求n维球的体积
  17. 电脑变慢,4K对齐来解决
  18. 服务器系统迁移工具,Win2008 R2迁移实战之迁移工具使用
  19. html mailto 不起作用,HTML Mailto 使用手记
  20. [干货分享]数美联合创始人CTO梁堃: 无孔不入的机器学习与人工智能

热门文章

  1. 微机原理及应用->指令系统概述
  2. 教你如何在wordpress中在你的网站页脚添加管局备案号
  3. 赛门铁克杀html病毒,HTML 感染 DropFileName = “svchost.exe” Ramnit 蠕虫病毒 查杀解决办法...
  4. java -jar 包编译在线工具
  5. 最新下载STM32固件库F1
  6. Python 做个小爬虫,要看技术交流群里小伙伴们的上榜情况,真的很方便!
  7. 爬虫技术框架——Heritrix
  8. 正则表达式中文字符和空格匹配
  9. 【原创】基于JavaWeb的社区疫情防控管理系统(疫情防控管理系统毕业设计)
  10. AIR2.0 打开exe