读书人

询问一个关于fork以后函数执行有关问题

发布时间: 2012-11-15 15:16:15 作者: rapoo

询问一个关于fork以后函数执行问题
正在自学《UNIX环境高级编程》,看到第八章进程控制这里有一个程序,如下:

C/C++ code
#include <stdio.h>#include <unistd.h>#include <stdlib.h>int glob = 6;char buf[] = "a write to stdout\n";intmain(void){    int var;    pid_t pid;    var = 88;    if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)    {        printf("write error");        return;    }    printf("before fork\n");    if ((pid = fork()) < 0)    {        printf("fork error");        return;    }    else if (pid == 0)    {        glob++;        var++;        printf("test1\n");    }    else    {        printf("sleep\n");        sleep(2);    }    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);    exit(0);}

不清楚为什么倒数第三行那个printf语句会被执行两次?请教各位这个函数的执行顺序。是不是子进程会将main函数重新执行一遍?还是只在if和else语句里面执行第二遍?用GDB跟踪也没看出啥结果来……
另外请教一下大家,看Unix/Linux环境编程入门类的书看什么啊?我总觉得这个APUE有点看不来……

[解决办法]
因为代码被父子进程共享,
C/C++ code
if ((pid = fork()) < 0)    {        printf("fork error");        return;    }    else if (pid == 0)    {        glob++;        var++;        printf("test1\n");    }    else    {        printf("sleep\n");        sleep(2);    }
[解决办法]
楼上正解,但有一词要换一下,不是共享而是复制,vfork才是共享。
fork调用会生成一个新的进程并将原程序的代码段,数据段,堆栈空间等复制到新进程的地址空间中,成为父进程的一个副本。在有写时复制机制的系统中代码段并不会立即被复制,而是将原程序的代码段直接映射到新进程。但数据段、堆栈空间等都是独立的。
vfork调用则不同,它所生成的新进程所有东西都是父进程的。直到用execX系列函数调用新的程序时才将新程序的代码,数据等复制到自己的进程空间,并创建自己的堆栈。

读书人网 >C语言

热点推荐