4380|2

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-29——Linux_Programing——进程及创建进程 [复制链接]

本帖最后由 yuanlai2010 于 2014-8-6 22:23 编辑

进程及创建进程
参与Helper2416开发板助学计划心得
程的UNIX标准定义:
一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源”
正在运行的程序或进程有程序代码/数据/变量(占用着系统内存)/打开的文件(文件描述符)和环境组成.
进程表
Linux进程表就像是一个数据结构,它把当前加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些ps命令输出的各类信息。(可以通过ps命令来查看)

进程标识符(PID)
在Linux系统中,每个进程都会有一个唯一的数字编号,称之为PID(进程标识符)
系统对进程的管理就是通过PID来索引的。
在程序中可以通过以下两个函数来获取当前进程的PID,以及当前进程的父进程的PID(即当前进程的PPID)
关于父子进程:假设在A进程中创建了进程B,则A称为B的父进程,B称为A的子进程。
通过以下函数可以获取当前进程的PID,或者PPID:
  1. #include <sys/types.h>        //这里提供对pid_t的定义
  2. #include <unistd.h>

  3. pid_t getpid(void);                //返回当前进程的PID

  4. pid_t getppid(void);        //返回当前进程的PPID
复制代码

在程序中创建新的进程
在Linux中有两个函数可以创建进程,那就是fork()与vfork()
比较有意思的是,fork函数只调用一次,但是在子进程和父进程都返回值,而且返回的值不相同,fork有以下三种不同的返回值:
       1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回一个负值;
如下例子,用fork来创建一个子进程。
  1. /* 2014 - 08 -06
  2. * yuanlai2010
  3. * fork调用测试
  4. */

  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>

  9. int main()
  10. {
  11.         pid_t pid;
  12.         int count = 0;
  13.         
  14.         printf("fork program starting!\n");
  15.         
  16.         pid = fork();
  17.         
  18.         switch(pid){
  19.         case -1:
  20.                 printf("fork failed\n");
  21.                 exit(1);
  22.         case 0:
  23.                 printf("this is child, the PID is %d\n", getpid());
  24.                 printf("and the count = %d\n",++count);
  25.                 break;
  26.         default:
  27.                 printf("this is parent, the PID is %d\n",getpid());
  28.                 printf("and the count = %d\n",++count);
  29.                 break;
  30.         }
  31.         exit(0);
  32. }
复制代码
运行结果如下
  1. [root@jyxtec fork]# ./fork_arm
  2. fork program starting!
  3. this is parent, the PID is 175
  4. and the count = 1
  5. [root@jyxtec fork]# this is child, the PID is 176
  6. and the count = 1
复制代码
进程调用fork()函数时,这个系统调用复制当前的进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的,新进程几乎与原进程一模一样,执行的代码也会完全相同(共享代码段),但是新进程有自己的数据空间、环境和文件描述符。fork()在成功调用完毕时会在子进程中返0,在父进程中返回的是子进程的PID,所以会出现以上的运行结果,对于子进程与父进程的运行顺序是不确定的。如果我们在新的进程中再调用exec系统调用,就可以创建出一个实实在在的新进程来完成特定的工作了

vfork()同fork函数很相似,细微的不同点主要在以下几点:
1:vfork函数在创建新的进程的时候,所有的数据都是共享父进程的。而fork创建的新进程则仅共享代码段。
2:在之前的fork函数调用后,对父子进程的执行顺序是没有限制的,但是在vfork调用后是限定了先执行子进程的,而且要一直到子进程执行exec或者exit后父进程才有机会被运行。

通过以下实验与刚开始那个fork实验的比较就就能看出其中的不同之处:
  1. /* 2014 - 08 -06
  2. * yuanlai2010
  3. * vfork调用测试
  4. */

  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>

  9. int main()
  10. {
  11.         pid_t pid;
  12.         int count = 0;
  13.         
  14.         printf("fork program starting!\n");
  15.         
  16.         pid = vfork();
  17.         
  18.         switch(pid){
  19.         case -1:
  20.                 printf("fork failed\n");
  21.                 exit(1);
  22.         case 0:
  23.                 printf("this is child, the PID is %d\n", getpid());
  24.                 printf("and the count = %d\n",++count);
  25.                 break;
  26.         default:
  27.                 printf("this is parent, the PID is %d\n",getpid());
  28.                 printf("and the count = %d\n",++count);
  29.                 break;
  30.         }
  31.         exit(0);
  32. }
复制代码
运行结果如下
  1. [root@jyxtec fork]# ./fork_arm
  2. fork program starting!
  3. this is child, the PID is 179
  4. and the count = 1
  5. this is parent, the PID is 178
  6. and the count = 2
  7. [root@jyxtec fork]#
复制代码

细心的你可能会发现在第一个实验中的输出结果有点乱,是什么原因,将在下一篇帖子讲述。
另外推荐论坛另外一篇相关的帖子https://bbs.eeworld.com.cn/thread-443452-1-1.html
这段时间在@lonerzf 的帖子中得到了很多启发!在这里深表感谢!

论坛ID:yuanlai2010
发表时间:2014-08-06

最新回复

不错  支持一下   详情 回复 发表于 2014-8-19 10:04

赞赏

1

查看全部赞赏

点赞 关注

回复
举报

241

帖子

4

TA的资源

纯净的硅(初级)

沙发
 
子进程创建与文件描述符相关:
1)exec不会关闭原先进程已经打开的文件描述符(除非是FD_CLOEXEC).
2)fork的子进程继承父进程打开的描述符.
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 
不错  支持一下
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表