目录
一、进程打开文件的流程
二、文件操作符
定义:
- 文件描述符是一个非负的索引值(一般从3开始,0、1、2已经被使用),指向内核中的 “文件记录表”,内核为进程中要打开的文件维护者一个“文件记录表;
- 当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符(内核记录表某一栏的索引);
- 当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
- Linux 下所有对设备和文件的操作都使用文件描述符来进行。
三、fork和open运用
1、先open再fork
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.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以后,子进程也是可以访问的,而且父子进程共享文件偏移量。(父进程打开一个文件,fork之后的子进程也可以使用,父子进程共享)。
2、先fork再open
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
pid_t pid=fork();
assert(pid!=-1);
int fd=open("file.txt",O_RDONLY);
assert(fd!=-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);
}
先open打开文件再进行fork复制,此时父子进程都有自己的文件打开流程了,文件偏移量就不再共享,父子进程独立。
四、库函数和系统调用
系统调用的执行过程:(现场保护、现场恢复)