先回忆一下fork()函数
由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。
1.在父进程中,fork返回新创建子进程的进程ID。
2.在子进程中,fork返回0。
3.如果出现错误,fork返回一个负值。

子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间,堆和栈的副本。注意,这是子进程所拥有的副本。父进程并不共享这些存储空间部分。父进程和子进程共享正文段。

第一题:

#include <unistd.h>
#include <stdio.h>int main()
{fork();/*第一行*/fork() && fork() || fork();/*第二行*/fork();/*第三行*/sleep(100);return 0;
}

此程序共产生多少个进程?
共 20 个进程 ,fork 了 19个进程,剩余的那一个是执行一开始的进程。
先解释fork()&&fork()||fork()//注释第二行

A&&B||C
1.当A = 0 或者 B = 0时 ,直接判断 C ;
2.如果 A > 0,则要继续判断B是否大于0,如果B = 0,则判断 C,如果B > 0,判断结束;
3.如果 B > 0 ,同理 (2)。

如图(执行的是第二行的进程图)

父进程执行第一个fork,生成 父进程 和 子进程1 ,父进程返回的是子进程1的进程ID 是大于 0的,子进程返回的是 0。
于是,父进程执行第二个fork ,生成 父进程 和 子进程 2。而子进程由于返回的是0,则执行第3个fork,生成 子进程1 和 子进程3。(子进程1是子进程他爸)
父进程,子进程1 和 子进程 3 执行完毕。
子进程 2返回 0,于是执行第三个fork,生成 子进程2 和 子进程4。
子进程2 和 子进程4 执行完毕。

此程序进程图

看看对不对!

不算一开始执行的进程就是19个~~。

下面据说是腾讯校招题

//1.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>int main(void)
{int i;for(i = 0 ; i < 2; i++){fork();printf("_");}return 0;
}
//2.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>int main(void)
{int i;for(i = 0 ; i < 2; i++){fork();printf("_\n");}return 0;
}

这两个程序各输出多少个”_”?
1.c的答案是 8个

2.c的答案是6个

如果标准输出连到终端,则它是行缓冲;否则它是全缓冲的。
标准输出缓冲区由换行符(’\n’)冲洗。

1.c由于没有带(‘\n’)所以printf中的‘—’留在缓冲区中。最后每个进程的缓冲区都有2个‘—’。
2.c带了(‘\n’),每创建一个进程就printf(“_\n”)一次。

fork()fork()||fork()相关推荐

  1. fork() || fork() || fork() 与 fork() fork() fork()

    先来看fork() || fork() || fork() #include<stdio.h> #include<unistd.h> #include<assert.h& ...

  2. Linux进程的创建函数fork()及其fork内核实现解析

    进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进程,被创建的进程为子进程. fork函数的接口定义如下: #include <unistd.h& ...

  3. fork() || fork()和fork() fork()笔试题

    程序一: #include "stdio.h" #include "sys/types.h" #include "unistd.h"int ...

  4. linux 内核 fork,Linux fork()一个进程内核态的变化

    [前言]用户态的变化,耳熟能详不在赘述.现在支持读时共享,写时复制. 一.内核态的变化 1.fork一个子进程代码 #include #include#include int main(int arg ...

  5. android fork 子进程,fork子进程

    title: fork子进程 data: 2019/3/21 20:24:39 toc: true 这里实在学习socket编程前的小知识点,用来创建多个服务端 学习文档 速记 fork并不保证父子进 ...

  6. 一个fork短码的扩展版本

    原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...

  7. java fork join原理_细说Fork/Join框架

    什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...

  8. fork/join 全面剖析,你可以不用,但是不能不懂!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浮云骑士LIN cnblogs.com/linlinismi ...

  9. java fork_浅谈Java的Fork/Join并发框架

    前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...

  10. fork/join 并行编程

    2019独角兽企业重金招聘Python工程师标准>>> import java.util.concurrent.ForkJoinPool; import java.util.conc ...

最新文章

  1. SUSE glibc升级为2.18过程记录
  2. 【Android 逆向】Android 系统中文件的用户和分组 ( 文件所有者与分组 | /sdcard/ 的文件分组 | /data/ 目录分析 | 用户类型 )
  3. 作为一名 ABAP 资深顾问,下一步可以选择哪一门 SAP 技术作为主攻方向?
  4. BetterZip结合自动操作工具和预设设置创建电影解压程序
  5. 精品教程--Android组件详解
  6. android商店账号密码错误,安卓:我失去了我的安卓密钥商店,我该怎么办?
  7. 警惕Python编程中异常处理结构可能的坑
  8. linux给命令起别名命令,alias命令 – 设置命令别名
  9. werkzeug serving.run_simple
  10. input html5 新特性,html5 input 新特性
  11. Aaron Swartz Rewriting Reddit中关于web.py的创建思路
  12. 百度文库文字下载(python原码)
  13. Killer网卡驱动导致蓝屏修复方法
  14. 基于51单片机的智能路灯照明控制系统proteus仿真原理图程序设计
  15. 性能测试工具------并发模式
  16. 计算机网络(谢希仁-第八版)第一章习题全解
  17. 单变量微积分重点(2)
  18. Android开发之实时更新系统时间
  19. 连接策略与搜索引擎优化
  20. E - Obstacle Course的详细解答

热门文章

  1. iPhone动态照片或泄露隐私 可读取拍摄地址
  2. JavaScript 面向对象编程思想
  3. 【使用OpenFeign在微服务中进行服务间通信】—— 每天一点小知识
  4. 深度学习手写字符识别
  5. 7-1 使用函数删除字符串中的字符 (10分)
  6. 学顶教育:初级会计师领取证书有关事项
  7. linux 汇编 perf,性能分析利器之perf浅析
  8. int转String
  9. .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法
  10. 基于姿态识别的手势识别