fork()函数语法
表1列出了fork()函数的语法要点。
表1 fork()函数语法要点
所需头文件 |
#include <sys/types.h> /* 提供类型pid_t的定义 */
#include <unistd.h>
|
函数原型 |
pid_t fork(void) |
函数返回值 |
0:子进程 |
子进程ID(大于0的整数):父进程 |
-1:出错 |
fork()函数的简单示例程序如下:
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()函数新建了一个子进程,其中的父进程返回子进程的进程号,而子进程的返回值为0。
由于fork()完整地复制了父进程的整个地址空间,因此执行速度是比较慢的。为了加快fork()的执行速度,很多UNIX系统设计者创建了vfork()。vfork()也能创建新进程,但它不产生父进程的副本。它是通过允许父子进程可访问相同物理内存,从而伪装了对进程地址空间的真实复制,当子进程需要改变内存中的数据时才复制父进程。这就是著名的“写操作时复制”(copy-on-write)技术。现在大部分嵌入式Linux系统的fork()函数调用已经采用vfork()函数的实现方式,例如uClinux所有的多进程管理都通过vfork()来实现。
本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》
热点链接:
1、Linux下多进程编程之fork()函数说明
2、Linux下多任务系统之线程介绍
3、Linux下进程的内存结构
4、Linux下进程的创建、执行和终止
5、Linux下的进程结构
更多新闻>> |