切换到宽版
  • 3316阅读
  • 1回复

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

楼层直达
张鹏飞 玫瑰花

头衔: 侠客
Uid: 34209 尚未绑定靓号,此帐号可能会被系统回收
性别:   

 发帖:   118 (帖)

 精华:   0 (帖)

 R金:   0 (G)
 威望:   268 (点)
 贡献:   0 (点) [邀请]
 彩钻:   4 (个)
荣誉勋章

查看勋章介绍

玫瑰花
级别: 转/ 级
HP: /
宠物信息
宠物名:
[显示宠物资料]

宠物名字:
MP: /
SP: / 5000
EXP: % [ ]
width=3 height='9'height='9' width=3
最近在看进程间的通信,看到了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 ...")。
本帖最近评分记录: 1 条评分 R金 +50
admin R金 +50 2013-04-03 -
admin 玫瑰花

头衔: 管理员
Uid: 1 尚未绑定靓号,此帐号可能会被系统回收
性别:    帅哥

 发帖:   2303 (帖)

 精华:   10 (帖)

 R金:   100 (G)
 威望:   5974 (点)
 贡献:   500 (点) [邀请]
 彩钻:   28 (个)
荣誉勋章

查看勋章介绍

只看该作者 沙发  发表于: 2013-04-03
玫瑰花
级别: 转/ 级
HP: /
宠物信息
宠物名:
[显示宠物资料]

宠物名字:
MP: /
SP: / 5000
EXP: % [ ]
width=3 height='9'height='9' width=3
感谢贡献
发帖 回复
« 返回列表上一主题下一主题
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个