
数据和文件描述符的继承.doc
2页1.fork()、文件和数据用系统 fork() 建立的子进程几乎与其父进程完全一样子进程中的所有变量均保持它们在父进程中之值(fork()的返回值除外) 因为子进程可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,不能影响到其它进程中的变量这一点非常重要另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文件描述符但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,这是以为子进程与父进程公用这些文件的文件指针这就有可能发生下列情况:由于文件指针由系统保存,所以程序中没有保存它的值,从而当子进程移动文件指针时,也等于移动了父进程的文件指针这就可能会产生意想不到到结果为了说明上述情况,我们给出一个实例程序 proc_file在这个程序中使用了两个预定义的函数 failure()和 printpos()failure()用来完成简单的出错处理,它只是调用 perror() 来显示出错信息其实现如下:failure( char* s){perror(s);exit(1);}printpos()实现显示一个文件的文件指针之值,其实现如下:printpos( char* string, int fildes){long pos;if ((pos=lseek(fildes,0L,1)#include #include Int failure( char* s){perror(s);exit(1);}Void printpos( char* string, int fildes){long pos;if ((pos=lseek(fildes,0L,SEEK_CUR))<0L)failure("lseek failed");printf("%s: %ld \n",string,pos);}Int main(void){int fd; /* 文件描述符*/int pid;/* 进程标识符*/char buf[10]; /* 数据缓冲区 *//* 打开文件*/if ((fd=open(" data",O_RDONLY))<0)failure("open failed");read(fd,buf,10); /* advance file pointer */printpos("Before fork",fd);/* fork 新进程*/if ((pid=fork())<0)failure("fork failed");else if (!pid)/* 子进程*/printpos("Child before read",fd);read(fd,buf,10);printpos("child after read",fd);} else {/* 父进程*//* 等待子进程运行结束*/wait(NULL);printpos("parent after wait",fd);}}该程序运行结果如下:Before fork: 10Child before read: 10child after read: 20parent after wait: 20这充分证明了文件指针为两个进程共用这一事.。
