一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

Test1

for(int i = 0; i<2; i++)
{
if(fork() == 0)
printf("A\n");
else
printf("B\n");
}

上述代码中,fork() 执行后会出现两个进程,子进程中的 fork() 返回值为 0,父进程中 fork() 返回值则是子进程的 pid

执行结果如下图

Test2

将上述代码稍微修改一下

for(int i = 0; i<2; i++)
{
if(fork() == 0)
printf("A");
else
printf("B");
}

该循环中打印没有字符 "\n",无法刷新缓冲区

每一次 fork() 会复制之前进程中缓冲区的字符

最后执行结果为

BBBAABAA

(取决于两个进程执行的顺序)

Test3

if(fork() && fork())
printf("A\n");
else
printf("B\n");

该 if 块中第一个 fork() 生成一个子进程,返回 0,所以第二个 fork() 不会执行

父进程返回 pid,执行第二个 fork(),再次产生一个子进程

所以最终 printf 调用了三次,最后执行结果为

A
B
B

Test4

#include <stdio.h>
#include <stdlib.h> // 测试栈空间的变量
void f0()
{
int tmp = 0;
int pid = fork();
if(pid == 0)
{
tmp++;
printf("son\n");
}
else if(pid > 0)
{
printf("parents\n");
}
else
{
return;
} printf("%d\n",tmp);
} int tmp1 = 5;
// 测试全局变量
void f1()
{
int pid = fork();
if(pid == 0)
{
tmp1++;
printf("son\n");
}
else if(pid > 0)
{
printf("parents\n");
}
else
{
return;
} printf("%d\n",tmp1);
} // 测试堆区变量
void f2()
{
int *tmp2 = (int*)malloc(sizeof(int));
*tmp2 = 0;
int pid = fork();
if(pid == 0)
{
(*tmp2)++;
printf("son\n");
}
else if(pid > 0)
{
printf("parents\n");
}
else
{
return;
} printf("%d\n",*tmp2);
}

通过在 main 分别执行以上三个函数,输出中父进程与子进程打印的 tmp 值均不相同

可以发现,fork() 后生成新的子进程与父进程是相互独立的,拥有独立的 VMA

Linux -- 进程管理之 fork() 函数的更多相关文章

  1. 进程管理之fork函数

    fork函数的定义 #include <unistd.h> #include <sys/types.h> pid_t fork(void); fork函数在父进程中返回子进程的 ...

  2. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...

  3. 【Linux编程】进程标识符与fork函数

    ID为0的进程一般是调度进程.常被称为交换进程(swapper),是内核中的系统进程. ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用. 一个现有进程能够调用fork函数创 ...

  4. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  5. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  6. Linux进程管理 (1)进程的诞生

    专题:Linux进程管理专题 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 L ...

  7. Linux进程管理 (2)CFS调度器

    关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...

  8. 《Linux 性能及调优指南》1.1 Linux进程管理

    https://blog.csdn.net/ljianhui/article/details/46718835 本文为IBM RedBook的Linux Performanceand Tuning G ...

  9. 《Linux性能及调优指南》----1.1 Linux进程管理

    翻译:飞哥 ( http://hi.baidu.com/imlidapeng ) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance ...

随机推荐

  1. 虚拟机--python环境配置

    1.安装VMware 2.安装Ubantu (1)打开VMware,打开编辑-->首选项,更改虚拟机存储的位置. (2)创建新的虚拟机(自定义): (3)编辑虚拟机--点击CD/VCD--更改成 ...

  2. js循环和调用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. httprunner-2-linux下搭建hrun(下)

    前言 前面我们说了linux下安装python3,hrun是需要依赖数据库,我们用docker进行安装mysql5.7让数据库能正常连接.安装mysql5.7请参考:https://www.cnblo ...

  4. 死磕 java线程系列之线程池深入解析——普通任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了Java中 ...

  5. node 短信接口的调用

    首先安装一下 短信的sdk 依赖 这里使用的是阿里云的短信SDK,在阿里云官网申请 npm install @alicloud/sms-sdk --save 调用 新建个 message.js /** ...

  6. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  7. null与undefined的区别?

    古之立大事者,不惟有超世之才,亦必有坚忍不拔之志. ——北宋· 苏 轼<晁错论> 1.首先看一个判断题:null和undefined 是否相等     console.log(null== ...

  8. C++等号操作符重载

    在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete.绝对不会有类似的问题. 当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时, ...

  9. 网络安全-主动信息收集篇第二章-二层网络扫描之scapy

    scapy是python第三方库文件,可以使用python进行调用也单独进行使用. 非常强大可以用于抓包.分析.创建.修改.注入网络流量. 使用scapy 详细使用方式可以查看github:https ...

  10. CSPS_106

    这场 死的太惨了! 我也不把我的错误像倒垃圾一样放在blog里了qwq 通过这场考试 我深深地认识到了情绪对人类的影响qwq 只要这种东西,不要出现在我的csp中就好了 T1 区间DP.. T2 枚举 ...