fork()函数解析
2016-06-27 21:16
211 查看
在了解fork()函数前,我们先来看个题
<span style="font-size:18px;">#include<stdio.h>
#include <unistd.h>
int main( ) {
fork( );
fork( );
fork( );
printf(“hello\n”);
return 0;
}</span>这个题目会输出几个hello呢?
接下来,我们去Linux中先去寻找这个答案;
![](http://img.blog.csdn.net/20160627204205835?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
不知道你是否知道是这个答案呢?如果不对,不要心急,我们来一步步的了解fork()这个函数
头文件
#include<unistd.h>/*#包含<unistd.h>*/
#include<sys/types.h>/*#包含<sys/types.h>*/
函数原型
pid_t fork( void);
(pid_t是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。
接下来,我们用一个小程序再去看看他的特性
![](http://img.blog.csdn.net/20160627205917609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160627205933875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这就可以看出,子进程它返回的的确是0;
接下来,我们把程序稍稍修改一下,在看看他们的改变
![](http://img.blog.csdn.net/20160627210815433?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果为
![](http://img.blog.csdn.net/20160627210829547?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上图便可以推断出父子进程的相互关系,以及它是如何产生的。
<span style="font-size:18px;">#include<stdio.h>
#include <unistd.h>
int main( ) {
fork( );
fork( );
fork( );
printf(“hello\n”);
return 0;
}</span>这个题目会输出几个hello呢?
接下来,我们去Linux中先去寻找这个答案;
不知道你是否知道是这个答案呢?如果不对,不要心急,我们来一步步的了解fork()这个函数
头文件
#include<unistd.h>/*#包含<unistd.h>*/
#include<sys/types.h>/*#包含<sys/types.h>*/
函数原型
pid_t fork( void);
(pid_t是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。
接下来,我们用一个小程序再去看看他的特性
这就可以看出,子进程它返回的的确是0;
接下来,我们把程序稍稍修改一下,在看看他们的改变
结果为
从上图便可以推断出父子进程的相互关系,以及它是如何产生的。
相关文章推荐
- Java学习笔记之二
- log4cplus使用(二)-自定义日志等级
- log4cplus使用
- ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容http://www.thinkphp.cn/extend/541.html
- Building a Dynamic UI with Fragments ---- Communicating with Other Fragme (三)
- C#设计模式-单例模式
- 图片尺寸的验证宽高
- java单例 生成唯一的标识
- Cocos2d-x开发系列 HYBrid模式四 C++和Lua的数据交互
- Android中<uses-sdk>属性和target属性分析
- 网络层详解----1
- 继承(四)
- Android jni Crash堆栈信息分析
- ListView的多布局
- 方法重写与重载
- 【毕业总结篇一】好用的c代码编辑工具与课本上学不到的冷门知识
- 第一周周一
- AOP
- 吉他学习<2>和弦
- 伪类选择器