理解fork()函数

学习 C 语言的进程概念时,会遇到 fork()函数。而遇到时要是有例子,会像下边的样子。执行后双输出。起初见到时,甚为难以理解。

我把见到的例子略作修改,以便于我理解这个函数涉及的进程概念。

vim child_process.c

  

gcc child_process.c

./a.out

这里的显示表示运行在父进程中。
[[email protected] chapter 7 进程控制]# 这个显示内容是在子进程中输出的。

echo $?

3

---------------------------------------------------------

这个输出结果就是一次运行、两次输出。分别由父进程一次输出、子进程一次输出。而就执行后返回值看,只显示了父进程的返回值。表示子进程的返回值不在终端返回;但是子进程的输出却会在终端返回。(有待验证,至少目前看到的是如此)

从代码看,运行到第 9 行时产生子进程。这个时候看到的代码就被复制了一份在另外一个进程空间独立执行。也就是说所谓的子进程就是父进程的“完全克隆”。在父子进程中存在相同的代码,只是具体到父子进程中,相同的代码被执行的代码是相左的。  然而,另外一个函数 vfork() 却不是这样的,一次执行只有一次输出;而且父子进程共享进程资源。

试着延长相应返回值代码的执行时间。再看返回值。

最终返回还是 3 。子进程跟父进程的结束并不存在确定的先后关系。而执行终端的返回却是一定的。

时间: 2024-10-12 07:49:56

理解fork()函数的相关文章

深入理解Linux的fork函数

一.问题引入 工作期间,某系统设计师抛出如下一个问题,下面的代码,输出几个"-"?: /****************************************************************************** Copyright by Thomas Hu, All rights reserved! Filename : fork01.c Author : Thomas Hu Date : 2012-8-5 Version : 1.0 Descript

linux中fork()函数详解[zz]

转载自:http://www.cnblogs.com/york-hust/archive/2012/11/23/2784534.html 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有

fork()函数,一次调用,两次返回

参考自:http://blog.csdn.net/dog_in_yellow/archive/2008/01/13/2041079.aspx 以前一直迷惑,什么叫一次调用,两次返回.通过上网搜索,终于知其原由.现将自己的理解记录于此.       准备知识:              内存中的进程包括三个部分:可执行文件(即程序),相关数据(包括变量,内存空间,缓冲区等),上下文环境(个人理解为从哪儿来,到哪儿去).我们知道,电脑CPU资源有限,单核就只有一个,多核也不是无限多.而当前运行的程序

fork( )函数详解

 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* *  fork_test.c *  version 1

dup和fork函数执行后的文件情况

dup和fork函数执行后的文件情况 转自http://blog.csdn.net/shanshanpt/article/details/39049579 对于dup和fork函数来说,前者是复制一个文件描述符,后者是复制进程,同时相关的文件信息也会被复制. 一.对于Dup 之前已经知道,对于一个进程来说,有一个files_struct来管理所有的相关文件,最终的反应形式其实就是一个文件数组而已: 所谓文件描述符就是数组下标.Dup函数总是从数组第一个元素开始扫描,获取第一个可用的文件描述符(也

fork函数返回值问题

fork是最难理解的概念之一:它执行一次却返回两个值. 首先我们来看下fork函数的原型: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 返回值: 负数:如果出错,则fork()返回-1,此时没有创建新的进程.最初的进程仍然运行. 零:在子进程中,fork()返回0 正数:在负进程中,fork()返回正的子进程的PID 其次我们来看下如何利用fork创建子进程. 创建子进程的样板代码如下所示: pid_t

linux fork()函数 转载~~~~

转自  ::  http://blog.csdn.net/jason314/article/details/5640969  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与

Linux中的fork()函数

 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* *  fork_test.c *  version 1

Linux fork函数详细图解-同时分析一道腾讯笔试题

原创blog,转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 注意,子进程是父进程的副本,拷贝父进程的数据空间,堆栈等资源.父子进程不共享上述资源. 每执行一次fork(