fork函数是创立一个新的进程作为原进程的子进程,创立的子进程和父进程存在许多的相似性,首要父子进程的虚拟存储空间的用户空间是相同的,是将父进程的复制给子进程。一起父子进程对文件的操作是同享方法。由于父进程的文件描述符表被复制给了子进程(详细的原理参虚拟存储器的内容,私有目标写时复制完成了父子进程之间构成彼此独立的地址空间)。因而父进程翻开的一切文件描述符都在子进程中保存了(每个进程都有独立的描述符表)。由于一切的进程同享文件表、v-node表,所以父子进程的描述符表也是相同的,所以父子进程对文件是以同享的方法存在的。
#include
#include
#include
#include
#include
#include
#include
int main()
{
int fd;
char c[3];
/*翻开文件foobar.txt,选用的是只读方法*/
fd = open(“foobar.txt”,O_RDONLY,0);
if(fork()==0)//子进程
{
read(fd,&c,2);/*读文件的一个字节到c中*/
c[2]=;
printf(“c = %s”,c);
exit(0);
/*子进程完毕*/
}
/*下面是父进程的读操作*/
wait(NULL);
read(fd,&c,2);
c[2]=;
printf(“c = %s”,c);
exit(0);
}
其间foobar.txt中的内容是foobar。
编译调试今后的结果是:
[gong@Gong-Computer cprogram]$ gcc -g fileshare2.c -o fileshare2
[gong@Gong-Computer cprogram]$ ./fileshare2
c = fo
c = ob
原因剖析:由于父子进程是以同享的方法操控现已翻开文件的,因而对文件的操作也是彼此影响的,因而读写文件的方位也会发生相应的改动。父(子)进程的文件读写方位会跟着子(父)进程的文件读写方位改动而改动,由于此刻改动的是文件表的文件方位项,而文件表是一切进程同享的,任何一个进程的修正都会影响到其他进程。可是父(子)进程对描述符的修正不会影响子(父)进程的描述符,由于close(fd)的操作仅仅改动文件表述符表中的内容,而该表是每个进程彼此独立的,因而不会改动其他进程的表。