资料介绍
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系列使用手册 12次下载
- 三菱微型可编程控制器MELSEC-F用户手册 0次下载
- AC500可编程控制器用户手册 15次下载
- ABB可编程控制器技术资料 18次下载
- AD714X输入CapTouch®可编程控制器Linux驱动程序
- AC500可编程控制器手册 10次下载
- S7-1200可编程控制器资料手册 35次下载
- 可编程控制器原理及应用 24次下载
- 进程控制块,信号集是什么资料下载
- XD和XL系列可编程控制器的规格参数和输入输出接线及运行维护的说明 5次下载
- Linux守护进程详解 0次下载
- 可编程控制器原理及应用 PPT
- 可编程控制器(PLC) 0次下载
- Linux系统进程管理入门指南 971次阅读
- Linux应用编程的基本概念 1.1k次阅读
- Linux中进程、线程和协程的基础概念 1.5k次阅读
- 如何在Linux使用ps/pstree/top命令查看进程 2.4k次阅读
- 可编程控制器的基本应用详细讲解 7.6k次阅读
- 可编程控制器的特点有哪些 9.3k次阅读
- 使用AT89C51实现的微型可编程控制器的讲解 3.4k次阅读
- 使用可编程控制器需要注意什么事项 5.3k次阅读
- 如何使用可编程控制器替代继电器 5.9k次阅读
- Linux进程调度时机概念分析 3.3k次阅读
- 可编程控制器的基本指令_可编程控制器的组成 5.5k次阅读
- 可编程控制器与单片机的区别 1.3w次阅读
- Linux进程管理:什么是进程?进程的生命周期 8.9k次阅读
- 可编程控制器基本知识_可编程控制器原理及应用 6.1w次阅读
- 基于Linux进程管理的详细剖析 4.2k次阅读
下载排行
本周
- 1冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 2安川A1000变频器中文版说明书
- 20.16 MB | 3次下载 | 3 积分
- 3直流电路的组成和基本定律
- 1.67 MB | 2次下载 | 免费
- 4丹佛斯2800系列变频器说明书
- 8.00 MB | 1次下载 | 5 积分
- 5PC8011同步开关型降压3.5A单节锂电池充电管理电路技术手册
- 0.74 MB | 1次下载 | 免费
- 6ES7243E+ES8311音频录制与播放电路资料
- 0.06 MB | 1次下载 | 5 积分
- 7SDM02 激光测距模块产品手册
- 0.43 MB | 1次下载 | 免费
- 8SDFM 激光测距模块模组手册
- 0.54 MB | 1次下载 | 免费
本月
- 1CH341编程器软件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下载 | 1 积分
- 22025智能家居传感器市场分析及创新应用
- 3.11 MB | 43次下载 | 免费
- 3RV1126B系列开发板产品资料
- 4.19 MB | 18次下载 | 免费
- 4CH341编程软件下载
- 2.50 MB | 16次下载 | 5 积分
- 5全志系列-米尔基于T153核心板开发板 四核异构、3路千兆网,赋能多元化工业场景
- 3.05 MB | 12次下载 | 免费
- 6【开源】60余套STM32单片机、嵌入式Linux、物联网、人工智能项目案例及入门学习资源包
- 10.55 MB | 8次下载 | 免费
- 7冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 8特斯拉MODEL S车载充电机主电路回路原理图
- 0.81 MB | 4次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935137次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233094次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191448次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183356次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81604次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73824次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App





创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论