fork()函数语法
表1列出了fork()函数的语法要点。
表1 fork()函数语法要点
所需头文件
#include /* 提供类型pid_t的定义 */
#include
函数原型
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()来实现。
热点链接: