您的位置 首页 报告

剖析fork后多进程对文件的同享

fork函数是创建一个新的进程作为原进程的子进程,创建的子进程和父进程存在很多的相似性,首先父子进程的虚拟存储空间的用户空间是相同的,

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)的操作仅仅改动文件表述符表中的内容,而该表是每个进程彼此独立的,因而不会改动其他进程的表。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/317793.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部