• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > Linux系统中C语言编程创建函数fork()执行解析

Linux系统中C语言编程创建函数fork()执行解析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了linux系统c语言编程,linux系统c语言,linux c 获取系统时间,linux c 设置系统时间,linux系统c编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:

1.函数本身

  (1)头文件

  #include<unistd.h>
  #include<sys/types.h>

  (2)函数原型

  pid_t fork( void);
  (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
  返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

  (3)函数说明

  一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,子进程有了独立的地址空间。

2.代码执行解释

  (1)代码如下图所示

  (2)分析

  由操作系统相关知识可知,进程是系统资源分配的基本单位,因此子进程与父进程不共享进程资源空间。在执行代码段第8行之前,系统中只有默认的主进程。在执行完代码段第8行后,系统中就有了两个进程,即主进程和由其创建的子进程。

  创建子进程,fork()函数返回两个数值,若创建成功,子进程中返回0;父进程返回子进程ID。用资源空间图示如下:

执行了fork()函数后,主进程为父进程生成了一份资源空间的副本。主进程中的pid为子进程的pid(pid>0),子进程中的pid为0。

  在fork()函数之后父进程与子进程都从下一行执行,即第9行。因为主进程中pid>0,可以执行else if(pid>0)段代码,子进程pid=0,可以执行else if(pid==0)段代码。

  (3)代码执行结果如下:

  可见,"Before the fork ..."只执行了一次。"After the fork ..."执行了两次。

  (具体的执行结果,可能会由于进程调度的不同,后面的四个输出顺序可能不同。不过第一个输出的一定是"Before the fork ...")。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux下C语言修改进程名称的方法
  • Linux系统中C语言编程创建函数fork()执行解析

相关文章

  • 2017-05-28C++函数中return语句的使用方法
  • 2017-05-28C语言中求余弦值的相关函数总结
  • 2017-05-28归并排序的递归实现与非递归实现代码
  • 2017-05-28浅谈C++中对象的复制与对象之间的相互赋值
  • 2017-05-28VC使用TerminateProcess结束进程实例
  • 2017-05-28使用Inotify 监控目录与文件的方法详解
  • 2017-05-28C语言中操作密码文件的一些函数总结
  • 2017-05-28c++传递函数指针和bind的示例
  • 2017-05-28MoveWindow() SetWindowPos()的区别于联系
  • 2017-05-28C/C++: Inline function, calloc 对比 malloc

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++多重继承与虚继承分析
    • 深入C++实现函数itoa()的分析
    • C++非递归队列实现二叉树的广度优先遍历
    • 一些C语言中字符串的算法问题解决实例小结
    • 使用opencv拉伸图像扩大分辨率示例
    • 进制转换:二进制、八进制、十六进制、十进制之间的转换
    • c++几种基本的插入排序(图文)
    • C++实现下载的代码
    • 解读堆排序算法及用C++实现基于最大堆的堆排序示例
    • 二维指针动态分配内存连续问题深入分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有