1、定义

#include

#include

pid_t fork( void );

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

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

2、函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。File locks and pending signals are not inherited. 【3】

If the call to fork() is executed successfully, Unix will

① make two identical copies of address spaces, one for the parent and the other for the child.

② Both processes will start their execution at the next statement following the fork() call.

3、为什么fork会返回两次?

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

After a new child process is created, both processes will execute the next instruction following the fork() system call.

调用fork之后,代码有两份,都从fork函数中返回。

Please note that Unix will make an exact copy of the parent's address space and give it to the child. Therefore, the parent and child processes have separate address spaces.

实例代码1:

#include

#include

#include

int main(int argc,char**argv)

{

int pid=fork();

if(pid == -1)

{

print("error!");

}

else if(pid == 0)

{

print("This is the child process!");

}

else

{

print("This is the parent process! child process id = %d", pid);

}

return 0;

}

示例代码2:#include

#include

#include

#include

#define MAX_COUNT 200

#define BUF_SIZE 100

void main(void)

{

pid_t pid;

int i;

char buf[BUF_SIZE];

fork();

pid = getpid();

for (i = 1; i <= MAX_COUNT; i++) {

sprintf(buf, "This line is from pid %d, value = %d\n", pid, i);

write(1, buf, strlen(buf));

}

}

为什么用write,而不用printf呢?because printf() is "buffered," meaning printf() will group the output of a process together,这样,会把子进程和父进程的输出混起来。所以用use the "unbuffered" write。

示例代码3:

#include

#include

#define MAX_COUNT 200

void ChildProcess(void); /* child process prototype */

void ParentProcess(void); /* parent process prototype */

int main(void)

{

pid_t pid;

pid = fork();

if (pid == 0)

ChildProcess();

else

ParentProcess();

return 0;

}

void ChildProcess(void)

{

int i;

for (i = 1; i <= MAX_COUNT; i++)

printf(" This line is from child, value = %d\n", i);

printf(" *** Child process is done ***\n");

}

void ParentProcess(void)

{

int i;

for (i = 1; i <= MAX_COUNT; i++)

printf("This line is from parent, value = %d\n", i);

printf("*** Parent is done ***\n");

}

4、Error Codes

出错返回错误信息如下:

EAGAIN :达到进程数上限.

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

fork()系统在Linux中的返回值是没有NULL的.

&lbrack;fork&rsqb;Linux中的fork函数详解

---------------------------------------------------------------------------------------------------- ...

Unix&sol;Linux中的fork函数

fork函数介绍 一个现有进程可以调用fork函数创建一个新进程.该函数定义如下: #include pid_t fork(void); // 返回:若成功则在子进程 ...

linux中的fork&lpar;&rpar;函数以及标准I&sol;O缓冲

1. fork()创建的新进程成为子进程.一次调用,两次返回,子进程的返回值是0,而父进程的返回值是新子进程的进程ID,如果出现错误,fork返回一个负值. 2. 可以通过fork返回的值来判断当前进 ...

linux中的fork函数的基本用法

代码: #include #include #include #include

Linux编程之fork函数

在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi ...

【Linux 进程】fork函数详解

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

解析Linux中的VFS文件系统机制

Linux中fork函数作用,深入解析Linux中的fork函数相关推荐

  1. linux中感叹号的作用,感叹号在Linux bash中使用技巧

    1. 重复执行上一条指令  !! [root@iZ23t6nzr7dZ python]# ls /usr/local/ aegis bin etc games include lib lib64 li ...

  2. linux中vfs和fs区别,解析Linux中的 VFS 文件系统机制(rootfs)一

    本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核.总体上说 Linux 下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(V ...

  3. 解析linux中的vfs文件系统机制,解析Linux中的VFS文件系统机制

    解析Linux中的VFS文件系统机制 本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核.总体上说Linux下的文件系统主要可分为三大块:一是上层的文件系统的系统 ...

  4. Python内置函数作用及解析

    Python内置的函数及其用法.为了方便记忆,已经有很多开发者将这些内置函数进行了如下分类: 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个 ...

  5. linux下分析cel文件,详细解析Linux scp命令的应用

    采用scp命令在Linux系统之间copy文件 不同的Linux之间copy文件常用有3种方法,第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的clie ...

  6. python中的点的作用_Python基础学习中关键点的作用(三),python,重点,之,函数,3

    函数学习之匿名函数 定义: 匿名函数是指在python中使用lambda所创建函数,称之为匿名函数. 特点: 创建函数不再使用def创建,而是使用lambda关键字创建一个形式主义的函数. 匿名函数的 ...

  7. c 语言 模板函数参数,深入解析C++中的函数模板和函数的默认参数

    C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具 ...

  8. java parcelable_Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下 在android提供了一种类型:Parcel.被用作封装数据的容器,封 ...

  9. java中domain什么意思_java解析URL中domain、端口和协议的两种方法

    java解析URL中domain.端口和协议的两种方法 Java代码 收藏代码 @Test public void parseDomain() throws IOException { for (in ...

  10. C语言switch中break的作用,C语言switch中break语句的作用

    问题: break在for循环.while循环等循环流程控制中起的作用是停止执行break后面的语句,跳出本次循环,并跳出该循环控制体: 在switch条件选择中,没有了循环控制,break又起什么作 ...

最新文章

  1. 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  2. 从电商用户触点看服务设计趋势
  3. OpenCV实现最大最小距离聚类算法
  4. 【Java数据库】使用JDBC操作MySQL数据库、Batch批处理 、事务的概念
  5. git撤销git commit
  6. Asp.net MVC 示例项目Suteki.Shop分析之---Model和Service
  7. Linux 下用yum安装mysql
  8. C#捕获控制台(console)关闭事件
  9. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(二)
  10. 测试基本理论-看这篇就够了
  11. linux hdmi /dev/fb操作,HDMI接口学习笔记
  12. c#大圣之路笔记——c#编程之@的3种作用
  13. Python获取对象所占内存大小方法
  14. Docker关闭容器命令(docker stop)
  15. 详解:化工厂人员定位方案与双重预防机制建设
  16. 物联卡套餐该如何选择
  17. 键盘事件(onkeyup onkeydown)
  18. 仿乐享微信源码分享,微信管家升级版最新版本
  19. 金蝶导出明细账到计算机桌面,怎么用金蝶将所有科目的明细账导到一张表格上?...
  20. 数独 ( 三 ) ——解数独

热门文章

  1. BT1120协议详解
  2. 【 Redis开发与运维】第3章 读书笔记
  3. 【项目管理】《挑战埃及》沙盘介绍
  4. 车载安卓屏刷鸿蒙,车载安卓大屏相比于原车导航种种优势
  5. ubantu下谷歌浏览器安装包
  6. Axure各种版本注册码 | 最新Axure RP 8.1.0.3377的授权码
  7. 2021年《职业防治法》宣传周活动资料海报挂图及职业病知识小手册等
  8. 浙大 计算机 毕业论文格式,浙大硕士毕业论文格式
  9. 网管第一课——网络组建与管理 目录
  10. 蓝桥杯真题-单词分析