询问一个关于fork以后函数执行问题
正在自学《UNIX环境高级编程》,看到第八章进程控制这里有一个程序,如下:
#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);}
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系列函数调用新的程序时才将新程序的代码,数据等复制到自己的进程空间,并创建自己的堆栈。