分析fork后多进程对文件的共享
#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)的操作只是改变文件表述符表中的内容,而该表是每个进程相互独立的,因此不会改变其他进程的表。
评论