1. fork系统调用头文件:<unistd.h>;

2. fork系统调用的原型:pid_t fork();

3. fork系统调用的返回值:pid_t是进程描述符类型,本质就是一个int。如果fork函数执行失败,返回一个负数(<0);如果fork调用执行成功,返回两个值:0和所创建子进程的ID。

4. fork系统调用的功能:以当前进程作为父进程创建出一个新的子进程,并且将父进程的所有资源拷贝给子进程,这样子进程作为父进程的一个副本存在。父子进程几乎时完全相同的,但也有不同的如父子进程ID不同。

5. 注意:当fork系统调用成功时,它会返回两个值:一个是0,另一个是所创建的新的子进程的ID(>0)。当fork成功调用后此时有两个数据相同的父子进程,我们可以通过fork的返回值来判断接下来程序是在执行父进程还是子进程。

pid_t pid = fork();
if(pid == 0)
{//在子进程中
}
else if(pid > 0)
{//在父进程中
}
else
{//fork调用失败
}

6. fork调用与文件描述符的关系

前面我们知道当我们使用fork系统调用以当前进程作为父进程创建出了一个子进程,父进程将自己的在fork系统调用之前的所有数据和代码都复制一份给子进程,此时子进程相当于父进程的一个拷贝。对于在fork调用之前打开的文件也一样,也会做一个拷贝将文件描述符复制给子进程,这样父子进程可以同时对一个文件进行操作。但是这种操作是共享式的,父子进程共享这个文件描述符所索引的文件。何谓父子进程共享这个文件呢?举个简单例子说明下

如果一个已经打开的txt文件,里边的内容是一个字符串“abcdefg”。在父进程中读取前两个字符“ab”,此时文件指针指向c。如果在子进程中再次读取两个字符,那么它读取就是“cd”,并且读完后文件指针指向e。这就是父子进程以共享的方式来操作文件。下面我们通过代码说明这个关系:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<iostream>
#include<pthread.h>
#include<fcntl.h>//为了使用O_RD_ONLY
int gb = 10;
using namespace std;
int main()
{int fd = open("fork.txt", O_RDONLY);if(fd < 0)//文件描述符是一个非负整数:0是stdin的文件描述符,1是stdout的文件描述符,2是stderr的文件描述符{cout<<"error in open the file!"<<endl;exit(1);}cout<<"文件描述符为:"<<fd<<endl;char *c = new char[3];int a = 5;cout<<"main函数中的进程ID:"<<getpid()<<endl;pid_t pid = fork();//fork系统调用的作用是:使用当前进程作为副本创建出一个子进程。它会返回两个值,一个是子进程的ID,一个是0if(pid == 0)//在子进程中{read(fd, c, 2);c[2] = '\0';cout << "---------------------------------------------"<<endl;cout << c << endl;gb += 10;a += 10;cout << "gb = " << gb << ",a = " << a << endl;cout << "子进程ID:" << getpid() << ",子进程的父进程ID为:" << getppid() << endl;cout << "子进程中pthread_self():" << pthread_self() << endl;//因为两个pthread_self()函数都是在主线程中的,所以两个获取的线程ID相同}else if(pid > 0)//在当前进程中,也就是父进程中{read(fd, c, 2);c[2] = '\0';cout << "--------------------------------------------"<<endl;cout << c << endl;cout << "gb = " << gb << ",a = " << a << endl;cout << "父进程ID:" << getpid() << ",父进程的父进程ID为:" << getppid() << endl;cout<<"父进程中pthread_self():"<<pthread_self()<<endl;//因为两个pthread_self()函数都是在主线程中的,所以两个获取的线程ID相同}else{cout<<"fork error!"<<endl;exit(1);}close(fd);//关闭文件描述符对应的文件,如果关闭成功返回0,关闭失败返回-1return 0;
}

在linux中执行结果:

这里我们使用open系统调用打开了一个名为fork.txt的文件,文件中的是一个个字符串。
 (1)文件描述符为3:因为系统中0时stdin的文件描述符,1是stdout的文件描述符,2是stderr的文件描述符。其他的用于索引我们自己打开的文件描述符,每打开一个一个文件就是使用最小的可使用的文件描述符表示。如果再打开一个文件,他的fd是4.

(2)使用getpid()函数可以获取当前进程的ID,使用getppid()可以获取当前进程的父进程的ID,使用pthread_self()可以获取当前线程的ID。

(3)通过结果可以看出我们使用fork创建了子进程并在子进程中对变量gb和a做了修改,但是这个修改并不会影响到父进程中两个变量的值。这是因为fork系统调用将父进程中的变量拷贝一份给子进程中。父子进程中的数据各不相关。

(4)在父进程中使用read系统调用读取文件的前两个字符ab。然后在子进程中再次读取两个字符是cd,而不是ab。这说明父子进程共享同一个文件,它们对文件的操作是同步的。

Linux中fork系统调用相关推荐

  1. Linux中fork()系统调用创建两个子进程

    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...

  2. Linux中fork的秘密

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  3. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  4. 【linux】linux中fork()详解(实例讲解)|fork的运行机制

    目录 linux中fork()函数详解 从一道面试题谈linux下fork的运行机制 linux中fork()函数详解 原文:linux中fork()函数详解(原创!!实例讲解)_jason314的博 ...

  5. linux fork 函数,Linux的fork()系统调用

    Linux的fork()系统调用,就是以父进程为模版创建子进程,是Linux系统的进程管理机制的核心API之一,另一个是调度器函数schedule(),它的用户态API就是之前说自旋锁时提到的sche ...

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

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

  7. linux中的系统调用

    前言:本文只讨论linux中的系统调用,不考虑windows等其他操作系统. 两点: 1.系统调用时,进程调用的是操作系统的内核函数,不是进程. 2.系统调用时,会出现上下文切换,但和进程调度时的上下 ...

  8. Linux多进程拷贝fork,浅析linux中fork函数

    Linux通过clone()系统调用实现fork().vfork()和__clone()库函数创建新的进程,这个调用通过一系列的参数标志来指明父子进程的共享资源,终将各自的参数标志位传递给clone, ...

  9. Linux中listen()系统调用的backlog参数分析

    这篇文章是对上一篇博客网络编程常用接口的内核实现----sys_listen()的补充,上篇文章中我说listen()系统调用的backlog参数既是连接队列的长度,也指定了半连接队列的长度(不能说等 ...

最新文章

  1. Protocol Buffer C++应用实例
  2. Machine Learning week 3 quiz : Regularization
  3. java 铁三车强度如何_工欲善其事,必先利其器--GIANT TRINITY铁三车
  4. Golang笔记——结构体
  5. Springboot2数据访问
  6. python输出用逗号隔开的数字_Python:从字符串中提取带有点和逗号的数字
  7. 什么是Apache Flink
  8. 更开放的分布式事务 | Fescar 品牌升级,更名为 Seata
  9. 内核中自带的内存调试方法CONFIG_DEBUG_SLAB
  10. 上海亚商投顾:三大指数小幅下跌 两市成交金额创年内新低
  11. CentOS护眼颜色
  12. 如何将mov格式转换成mp4并且不改变分辨率
  13. Chrome浏览器下调试和动态修改网页JavaScript
  14. 复旦提出M2TR:首个多模态多尺度Transformer
  15. Qlv转换MP4格式 让你不再错过
  16. 天龙八单机服务器 修改 藏宝,天龙八部单机版
  17. 名帖111 董其昌 小楷《千字文》
  18. [论文笔记] SODA小目标综述(西工大)
  19. Direct3D 12 尝鲜: 基本呈现
  20. Linux -- SELinux配置及应用(1)

热门文章

  1. 论ESP32自动下载电路
  2. 信息管理毕业设计 SSM的小区车位出租管理系统(源码+论文)
  3. GY-US42超声波传感器模块介绍
  4. 网站前后端分离情况下如何实现QQ微信等第三方登陆
  5. 99美元的Mira Prism,将iPhone变成一个迷你“HoloLens”
  6. 南京大学计算机系本科生开放日,2018/7
  7. 555定时器5脚如何控制电压基准
  8. STM32F103C8T6高级控制和通用定时器通道引脚分布
  9. 日语学习资料 - 万叶集 三本
  10. JSP PHP ASP 语言的比较和区别 详解