系统 fork()建立的子进程几乎与其父进程完全一样。子进程中的所有变量均保持它们在父进程中之值(fork()的返回值除外)。因为子进程可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,不能影响到其它进程中的变量。
#include #include #include #include void failure(char* s) { perror(s); exit(1); } void printpos(char* string, int fields) { long pos; pos = lseek(fields,0L,1); if(pos < 0L) failure("lseek failed"); printf("%s %ld \n",string,pos); } int main(void) { int fd; int pid; char buf[10]; fd = open("data",O_RDONLY); if(fd < 0) failure("open file fail"); read(fd,buf,10); printpos("before fork",fd); pid = fork(); if(pid < 0) failure("fork failed"); if(!pid){ printpos("child before read",fd); read(fd,buf,10); printpos("child after read",fd); } else { wait(NULL); printpos("parent after wait",fd); } return 0; }
另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文件描述符。但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,这是以为子进程与父进程公用这些文件的文件指针。