电子发烧友App

硬声App

扫码添加小助手

加入工程师交流群

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>嵌入式开发>Linux进程控制编程

Linux进程控制编程

2017-10-18 | rar | 0.6 MB | 次下载 | 1积分

资料介绍

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函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。
  
Linux 操作系统
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1冷柜-电气控制系统讲解
  2. 13.68 MB  |  4次下载  |  10 积分
  3. 2安川A1000变频器中文版说明书
  4. 20.16 MB  |  3次下载  |  3 积分
  5. 3直流电路的组成和基本定律
  6. 1.67 MB   |  2次下载  |  免费
  7. 4丹佛斯2800系列变频器说明书
  8. 8.00 MB  |  1次下载  |  5 积分
  9. 5PC8011同步开关型降压3.5A单节锂电池充电管理电路技术手册
  10. 0.74 MB   |  1次下载  |  免费
  11. 6ES7243E+ES8311音频录制与播放电路资料
  12. 0.06 MB   |  1次下载  |  5 积分
  13. 7SDM02 激光测距模块产品手册
  14. 0.43 MB   |  1次下载  |  免费
  15. 8SDFM 激光测距模块模组手册
  16. 0.54 MB   |  1次下载  |  免费

本月

  1. 1CH341编程器软件NeoProgrammer_2.2.0.10
  2. 20.47 MB   |  170次下载  |  1 积分
  3. 22025智能家居传感器市场分析及创新应用
  4. 3.11 MB  |  43次下载  |  免费
  5. 3RV1126B系列开发板产品资料
  6. 4.19 MB  |  18次下载  |  免费
  7. 4CH341编程软件下载
  8. 2.50 MB   |  16次下载  |  5 积分
  9. 5全志系列-米尔基于T153核心板开发板 四核异构、3路千兆网,赋能多元化工业场景
  10. 3.05 MB  |  12次下载  |  免费
  11. 6【开源】60余套STM32单片机、嵌入式Linux、物联网、人工智能项目案例及入门学习资源包
  12. 10.55 MB  |  8次下载  |  免费
  13. 7冷柜-电气控制系统讲解
  14. 13.68 MB  |  4次下载  |  10 积分
  15. 8特斯拉MODEL S车载充电机主电路回路原理图
  16. 0.81 MB   |  4次下载  |  3 积分

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935137次下载  |  10 积分
  3. 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
  4. 1.48MB  |  420064次下载  |  10 积分
  5. 3Altium DXP2002下载入口
  6. 未知  |  233094次下载  |  10 积分
  7. 4电路仿真软件multisim 10.0免费下载
  8. 340992  |  191448次下载  |  10 积分
  9. 5十天学会AVR单片机与C语言视频教程 下载
  10. 158M  |  183356次下载  |  10 积分
  11. 6labview8.5下载
  12. 未知  |  81604次下载  |  10 积分
  13. 7Keil工具MDK-Arm免费下载
  14. 0.02 MB  |  73824次下载  |  10 积分
  15. 8LabVIEW 8.6下载
  16. 未知  |  65991次下载  |  10 积分