新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 进程控制开发之:Linux进程控制编程

进程控制开发之:Linux进程控制编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257131.htm

7.2编程

1.()

中创建一个新进程的惟一方法是使用()()中一个非常重要的,和读者以往遇到的函数有一些区别,因为它看起来执行一次却返回两个值。难道一个函数真的能返回两个值吗?希望读者能认真地学习这一部分的内容。

(1)fork()函数说明。

fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。

因为子进程几乎是父进程的完全复制,所以父子两个进程会运行同一个程序。因此需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。

实际上是在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行。从而两个进程分别获得其所属fork()的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。

同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得fork()函数的系统开销比较大,而且执行速度也不是很快。

(2)fork()函数语法。

表7.2列出了fork()函数的语法要点。

表7.2 fork()函数语法要点

所需头文件

#includesys/types.h>//提供类型pid_t的定义
#includeunistd.h>

函数原型

pid_tfork(void)

函数返回值

0:子进程

子进程ID(大于0的整数):父进程

-1:出错

(3)fork()函数使用实例。

/*fork.c*/

#includesys/types.h>

#includeunistd.h>

#includestdio.h>

#includestdlib.h>

intmain(void)

{

pid_tresult;

/*调用fork()函数*/

result=fork();

/*通过result的值来判断fork()函数的返回情况,首先进行出错处理*/

if(result==-1)

{

printf(Forkerror\n);

}

elseif(result==0)/*返回值为0代表子进程*/

{

printf(Thereturnedvalueis%d\n

Inchildprocess!!\nMyPIDis%d\n,result,getpid());

}

else/*返回值大于0代表父进程*/

{

printf(Thereturnedvalueis%d\n

Infatherprocess!!\nMyPIDis%d\n,result,getpid());

}

returnresult;

}

将可执行程序下载到目标板上,运行结果如下所示:

$arm-linux-gccfork.c–ofork(或者修改Makefile)

$./fork

Thereturnedvalueis76/*在父进程中打印的信息*/

Infatherprocess!!

MyPIDis75

Thereturnedvalueis:0/*在子进程中打印的信息*/

Inchildprocess!!

MyPIDis76

从该实例中可以看出,使用fork()函数新建了一个子进程,其中的父进程返回子进程的PID,而子进程的返回值为0。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 4 5 下一页

评论


相关推荐

技术专区

关闭