问题:
(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(先open再fork)
(2)能否用代码简单的验证一下?
(3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样?能否用代码简单验证一下.(先fork再open会怎么样?)
1).进程打开文件的流程
inode:
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。通过这个inode节点,即通过文件具体的一些信息,我们才能找到这个文件,读取它.
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
2).先打开再fork的流程
代码如下:
先创建一个文件file.txt,内容为abcdefg;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
int main()
{
int fd=open("file.txt",O_RDONLY);
assert(fd!=-1);
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
char buff[128]={0};
int n=read(fd,buff,1);
printf("child:%s\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("child:%s\n",buff);
}
else
{
char buff[128]={0};
int n=read(fd,buff,1);
printf("parent:%s\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("parent:%s\n",buff);
}
close(fd);
exit(0);
}
父进程打开文件以后,fork产生子进程,父子进程共享打开的文件,同时共享文件偏移量;
为什么?如图:
3).先fork再open
代码修改如下:
pid_t pid=fork();
assert(pid!=-1);
int fd=open("file.txt",O_RDONLY);
assert(fd!=-1);
(了解文件偏移量不共享)
为什么?如图:
面试题答案:
在 (1)fork 之前打开的文件,在复制进程后,父子进程共享文件偏移量,所以文件指针在相同位置。
(2)代码详见文章前面部分
(3)先fork再打开文件,父子进程各自打开各自的,不共享偏移量;代码详见文章前面部分;