fork() 函数是 linux/unix 下一种特别的创建子进程的函数,它不同与 Windows,这个函数在执行成功后会有两个返回值,一个返回值==0代表创建了子进程,一个返回值大于0代表还是当前程序进程,而这个大于0的值就是创建的子进程的进程PID。这个函数比较抽象,我们来看一下代码并对比一下图片就能知道具体该函数的用途了。

#include

#include

int main(int argc, char* argv[])

{

pid_t pid = fork();

if (pid == 0)

{

// 新创建的子进程

while (1)

{

printf("child : PID = %d, ParentID = %d\n", getpid(), getppid());

sleep(1);

}

}

else if (pid > 0)

{

// 当前进程

while (1)

{

printf("parent: PID = %d, ParentID = %d\n", getpid(), getppid());

sleep(1);

}

}

return 0;

}

该程序运行后,会产生两个分支,一个分支是创建的新子进程所执行的分支,它会不断的打印自身的PID和父进程的PID。

另外一个分支是原有的进程分支,它也同样会不断的打印自身的进程PID和父进程的PID,运行后效果图如下:

图中可以看出,新创建的子进程 PID = 3606,其父进程 PID = 3605 也就是我们运行的 fork 程序的 PID,而另外一个分支 fork 程序的 PID = 3605,其父进程 PID = 2012,就是终端所属的 bash 进程的 PID。这样我们就可以得出结论,我们手动通过终端(PID 2012)调用了 fork 程序 (PID 3605),然后 fork 程序又创建了一个子进程 (PID 3606)。

以上就是  fork 函数的具体功能,它看上去更像是在进程中创建了一个线程,但实际并不是,这是 linux/unix 一种特有的创建进程的方式。当子进程创建时,其复制父进程 0~3G的虚拟地址空间和父进程内核中的PCB(PCB虽然复制但是ID号不同),他们的数据在读取时是共享的,在写时执行复制。

所谓“读时共享,写时复制”到底是怎么样一个概念?我们看一下下面的例子:

#include

#include

#include

int main(int argc, char* argv[])

{

pid_t pid;

char *message;

int n;

pid = fork();

if (pid < 0) {

perror("fork failed");

exit(1);

}

if (pid == 0) {

message = "This is the child\n";

n = 6;

} else {

message = "This is the parent\n";

n = 3;

}

for(; n > 0; n--) {

printf("%s", message);

sleep(1);

}

return 0;

}

对于代码中的变量 n 来说,在创建了子进程以后,对 n 进行了修改,此时就会复制父进程虚拟地址空间中的信息提供给子进程继续向下执行,两个进程使用完全不同的地址空间,所以父进程最后for循环只会执行3次,而子进程则会执行6次。如下图(因为父进程提前执行完毕,所以没等子进程打印完信息,终端就恢复运行了):

【gdb调试相关】

使用gdb调试的时候,gdb只能跟踪一个进程。可以设置gdb跟踪父进程或者是跟踪子进程。

set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。

set follow-fork-mode parent 设置跟踪父进程。

默认跟踪父进程。

相关

linux中fork函数详解,fork() 函数详解相关推荐

  1. Linux中man手册的安装以及使用详解

    Linux中man手册的安装以及使用详解 linux中man手册的安装以及使用详解 man手册是什么 man手册是干嘛的 man手册如何安装 man手册如何使用 举例讲解 我们来看一下man手册的目录 ...

  2. linux压缩命令zip详解,Linux中zip压缩和unzip解压缩命令详解

    如果你的英文足够好,那完全可以不靠任何人就精通linux,只要你会用man.Man实际上就是查看指令用法的help,学习任何一种UNIX类的操作系统最重要的就是学会使用man这个辅助命令.接下来是小编 ...

  3. linux 移动剪切命令,Linux中vi的复制命令的用法详解

    在Linux系统中,使用VI编辑的时候经常用到的操作就是复制粘贴,那么下面由学习啦小编为大家整理了linux中vi的复制命令的用法详解的相关知识,希望对大家有帮助! Linux中vi的复制命令的用法详 ...

  4. linux中替换命令详解,linux中sed命令字符串替换的用法详解

    Linux系统中sed命令可以将字符串批量替换,省去了很多麻烦,下面由学习啦小编为大家整理了linux系统中sed命令字符串替换的用法详解,希望对大家有帮助! linux中sed命令字符串替换的用法详 ...

  5. Linux中压缩和解压(gzip压缩/gunzip解压)(zip压缩/unzip解压)(tar打包解压)

    文章目录 Linux中压缩和解压(gzip压缩/gunzip解压)(zip压缩/unzip解压)(tar打包解压) 一.gzip压缩 / gunzip解压 1.命令 2.注意 3.案例 4.常用 二. ...

  6. linux中的SGI(核间中断)IPI_RESCHEDULE详解

    1.SGI中断(核间通信中断) 在gicv2/gicv3中,SGI中断(中断号0-15)是software generate interrupt,用户核间中断. 我们一般将0-7划分给linux中使用 ...

  7. Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数

    一:    ioctl函数的作用 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据.也就是说,read/ ...

  8. Linux中./configure、make、make install详解

    ./configure && make && make install详解 2010-08-03 23:30:05 标签: 休闲  ./configure && ...

  9. linux中grep命令返回值,grep命令详解

    如果你是一个新手,请从头阅读这篇文章,如果你只是忘记了grep命令的一些常用选项,直接查看文章尾部的总结部分即可. 先说说grep命令能做什么? 我们可以使用grep命令在文本中查找指定的字符串,就像 ...

  10. Linux中修改MTU值及MTU值详解

    部分参考<鸟哥的Linux私房菜>http://cn.linux.vbird.org/ MTU( Maximum Transmission Unit,最大传输单位) 用来设置描述网络接口的 ...

最新文章

  1. 从 Gzip 压缩 SVG 说起 — 论如何减小资源文件的大小
  2. 孙鑫老师教学视频学习笔记——单文档中菜单操作
  3. 主键能否@onetoone_双向@OneToOne主键关联
  4. 总奖池2.5万美元,Kaggle 新赛,单细胞分类与分割
  5. Android设置Alpha值实现图片渐变效果
  6. PyTorch 1.0 中文文档:数据类型信息
  7. 【Mac】Mac 下安装MySQL优化工具mysqltuner执行报错 [!!] Attempted to use login credentials
  8. A4纸尺寸 web打印报告
  9. 小端法、大端法、网络字节转序
  10. 【编程之美】java二进制实现重建
  11. java character_[转载]Java中Character类的使用方法
  12. hyperscan cmake .. 报错
  13. yar php使用,php的轻量级rpc框架yar
  14. 怎么实现微信公众号生成专属二维码推广来源统计
  15. php连接mongodb数据库报错No suitable servers found
  16. web服务之LAMPLNMP架构
  17. mysql时间格式化到小时_mysql 时间格式化
  18. 神经网络与深度学习(一)——机器学习基础
  19. 软件架构中的高可用设计
  20. Nacos Serve 本地启动报Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCre

热门文章

  1. Biological Psychiatry:人脑转录组成像的最佳实践
  2. 利用python-docx批量处理Word文件—图片
  3. 使用word生成xps文件的两种方式
  4. 生源211占比逐年增加,南开网安性价比超高~
  5. 服务器监控文件变化,如何使用nodejs监控文件变化并使用sftp上传到服务器
  6. 在线式测斜仪的工作原理和技术参数
  7. 关于layout_alignParentLeft、layout_alignLeft、layout_toLeftOf、layout_marginLeft的区别
  8. 谨以此篇纪念CSDN创作两周年——20221028
  9. 【Java版高级数据结构】树论基础二叉树
  10. QA特辑 | 这场直播解决了我对于电商风控的大部分疑问