用系统 fork() 建立的子进程几乎与其父进程完全一样。子进程中的所有变量均保持 它
们在父进程中之值( fork()的返回值除外)。因为子进程可用的数据是父进程可用数据的拷
贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,
不能影响到其它进程中的变量。这一点非常重要。
另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文
件描述符。但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,
这是以为子进程与父进程公用这些文件的文件指针。这就有可能发生下列情况:由于文件
指针由系统保存,所以程序中没有保存它的值,从而当子进程移动文件指针时,也等于移
动了父进程的文件指针。这就可能会产生意想不到到结果。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
void failure(char *s)
{
perror(s);
exit(1);
}
void printfpos(char * string ,int files)
{
long pos;
if((pos=lseek(files,0L,1))<0L)
failure("lseek error!!");
printf("%s:%d\n",string,pos);
}
void main()
{
int fd;
int pid;
int buff[20];
if((fd=open("data",O_RDONLY))<0)
failure("open error!!");
read(fd,buff,10);
printfpos("Fork Before",fd);
if((pid=fork())<0)
{
failure("fork error!!");
}
else if(!pid)
{
printfpos("child fd before:",fd);
read(fd,buff,10);
printfpos("child fd after",fd);
}
else
{
wait(NULL);
printfpos("father fd",fd);
}
}
运行结果:
Fork Before:10
child fd before::10
child fd after:20
father fd:20
这充分说明了文件指针为两个进程共用这一事实。