资料介绍
7.2 Linux进程控制编程
1.fork()
在Linux中创建一个新进程的惟一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和读者以往遇到的函数有一些区别,因为它看起来执行一次却返回两个值。难道一个函数真的能返回两个值吗?希望读者能认真地学习这一部分的内容。
(1)fork()函数说明。
fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
因为子进程几乎是父进程的完全复制,所以父子两个进程会运行同一个程序。因此需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。
实际上是在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行。从而两个进程分别获得其所属fork()的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。
同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得fork()函数的系统开销比较大,而且执行速度也不是很快。
(2)fork()函数语法。
表7.2列出了fork()函数的语法要点。
表7.2 fork()函数语法要点
所需头文件#include 《sys/types.h》 // 提供类型pid_t的定义
#include 《unistd.h》
函数原型pid_t fork(void)
函数返回值0:子进程
子进程ID(大于0的整数):父进程
-1:出错
(3)fork()函数使用实例。
/* fork.c */
#include 《sys/types.h》
#include 《unistd.h》
#include 《stdio.h》
#include 《stdlib.h》
int main(void)
{
pid_t result;
/*调用fork()函数*/
result = fork();
/*通过result的值来判断fork()函数的返回情况,首先进行出错处理*/
if(result == -1)
{
printf(“Fork error\n”);
}
else if (result == 0) /*返回值为0代表子进程*/
{
printf(“The returned value is %d\n
In child process!!\nMy PID is %d\n”,result,getpid());
}
else /*返回值大于0代表父进程*/
{
printf(“The returned value is %d\n
In father process!!\nMy PID is %d\n”,result,getpid());
}
return result;
}
将可执行程序下载到目标板上,运行结果如下所示:
$ arm-linux-gcc fork.c –o fork (或者修改Makefile)
$ 。/fork
The returned value is 76 /* 在父进程中打印的信息 */
In father process!!
My PID is 75
The returned value is :0 /* 在子进程中打印的信息 */
In child process!!
My PID is 76
从该实例中可以看出,使用fork()函数新建了一个子进程,其中的父进程返回子进程的PID,而子进程的返回值为0。
(4)函数使用注意点。
fork()函数使用一次就创建一个进程,所以若把fork()函数放在了if else判断语句中则要小心,不能多次使用fork()函数。
小知识由于fork()完整地复制了父进程的整个地址空间,因此执行速度是比较慢的。为了加快fork()的执行速度,有些UNIX系统设计者创建了vfork()。vfork()也能创建新进程,但它不产生父进程的副本。它是通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才复制父进程。这就是著名的“写操作时复制”(copy-on-write)技术。
现在很多嵌入式Linux系统的fork()函数调用都采用vfork()函数的实现方式,实际上uClinux所有的多进程管理都通过vfork()来实现。
2.exec函数族
(1)exec函数族说明。
fork()函数是用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?这个exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
在Linux中使用exec函数族主要有两种情况。
n 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生。
n 如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。
1.fork()
在Linux中创建一个新进程的惟一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和读者以往遇到的函数有一些区别,因为它看起来执行一次却返回两个值。难道一个函数真的能返回两个值吗?希望读者能认真地学习这一部分的内容。
(1)fork()函数说明。
fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
因为子进程几乎是父进程的完全复制,所以父子两个进程会运行同一个程序。因此需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。
实际上是在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行。从而两个进程分别获得其所属fork()的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。
同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得fork()函数的系统开销比较大,而且执行速度也不是很快。
(2)fork()函数语法。
表7.2列出了fork()函数的语法要点。
表7.2 fork()函数语法要点
所需头文件#include 《sys/types.h》 // 提供类型pid_t的定义
#include 《unistd.h》
函数原型pid_t fork(void)
函数返回值0:子进程
子进程ID(大于0的整数):父进程
-1:出错
(3)fork()函数使用实例。
/* fork.c */
#include 《sys/types.h》
#include 《unistd.h》
#include 《stdio.h》
#include 《stdlib.h》
int main(void)
{
pid_t result;
/*调用fork()函数*/
result = fork();
/*通过result的值来判断fork()函数的返回情况,首先进行出错处理*/
if(result == -1)
{
printf(“Fork error\n”);
}
else if (result == 0) /*返回值为0代表子进程*/
{
printf(“The returned value is %d\n
In child process!!\nMy PID is %d\n”,result,getpid());
}
else /*返回值大于0代表父进程*/
{
printf(“The returned value is %d\n
In father process!!\nMy PID is %d\n”,result,getpid());
}
return result;
}
将可执行程序下载到目标板上,运行结果如下所示:
$ arm-linux-gcc fork.c –o fork (或者修改Makefile)
$ 。/fork
The returned value is 76 /* 在父进程中打印的信息 */
In father process!!
My PID is 75
The returned value is :0 /* 在子进程中打印的信息 */
In child process!!
My PID is 76
从该实例中可以看出,使用fork()函数新建了一个子进程,其中的父进程返回子进程的PID,而子进程的返回值为0。
(4)函数使用注意点。
fork()函数使用一次就创建一个进程,所以若把fork()函数放在了if else判断语句中则要小心,不能多次使用fork()函数。
小知识由于fork()完整地复制了父进程的整个地址空间,因此执行速度是比较慢的。为了加快fork()的执行速度,有些UNIX系统设计者创建了vfork()。vfork()也能创建新进程,但它不产生父进程的副本。它是通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才复制父进程。这就是著名的“写操作时复制”(copy-on-write)技术。
现在很多嵌入式Linux系统的fork()函数调用都采用vfork()函数的实现方式,实际上uClinux所有的多进程管理都通过vfork()来实现。
2.exec函数族
(1)exec函数族说明。
fork()函数是用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?这个exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
在Linux中使用exec函数族主要有两种情况。
n 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生。
n 如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 《图解继电器与可编程控制器》冈本裕生著 0次下载
- 可编程控制器AC500用户手册 1次下载
- 三菱微型可编程控制器FX1s系列使用手册 6次下载
- 三菱微型可编程控制器MELSEC-F用户手册 0次下载
- AC500可编程控制器用户手册 13次下载
- ABB可编程控制器技术资料 17次下载
- AD714X输入CapTouch®可编程控制器Linux驱动程序
- AC500可编程控制器手册 9次下载
- S7-1200可编程控制器资料手册 33次下载
- 可编程控制器原理及应用 21次下载
- 进程控制块,信号集是什么资料下载
- XD和XL系列可编程控制器的规格参数和输入输出接线及运行维护的说明 4次下载
- Linux守护进程详解 0次下载
- 可编程控制器原理及应用 PPT
- 可编程控制器(PLC) 0次下载
- Linux中进程、线程和协程的基础概念 650次阅读
- 可编程控制器与变频器的连接和连接时应注意的问题 760次阅读
- 如何在Linux使用ps/pstree/top命令查看进程 1666次阅读
- 可编程控制器的基本应用详细讲解 6802次阅读
- 可编程控制器的特点有哪些 8438次阅读
- 使用AT89C51实现的微型可编程控制器的讲解 2601次阅读
- Linux:测试进程占用的虚拟内存大小 2762次阅读
- 使用可编程控制器需要注意什么事项 4501次阅读
- 如何使用可编程控制器替代继电器 4836次阅读
- Linux进程调度时机概念分析 2682次阅读
- 可编程控制器的基本指令_可编程控制器的组成 4720次阅读
- 可编程控制器与单片机的区别 1.2w次阅读
- Linux进程管理:什么是进程?进程的生命周期 7750次阅读
- 可编程控制器基本知识_可编程控制器原理及应用 5.8w次阅读
- 基于Linux进程管理的详细剖析 3630次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大威廉希尔官方网站 图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成威廉希尔官方网站 应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口威廉希尔官方网站 图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字威廉希尔官方网站 基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动威廉希尔官方网站 设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6威廉希尔官方网站 仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多