Linux下多进程编程之fork()函数语法

分享到:
           

    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下的进程结构

更多新闻>>