第四章 输入输出与文件系统

发布时间 2023-06-25 16:46:27作者: 银脉河

标准IO库

文件打开和关闭函数

#include <sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
int fd=open(char* filename, int flags, mode_t mode);
           返回: 若成功返回新文件描述符,若出错为-1
int close(int fd);
           返回: 若成功则为>0. 若出错为-1.

⽂件定位与⽂件内容随机读取

#include <unistd.h>
#include <sys/types.h>
off_set  lseek(int fd, off_t offset , int whence);

练习

内核文件

打开文件内核

下⾯的程序fdtest. c在启动时,⽂件描述符0、1、2已经分配给stdin、stdout、stderr三台设备,

从3以后的⽂件描述符为空闲,三个open函数以读写⽅式打开⽂件。假设⽤户对当前⽬录具有写权

限,则open函数调⽤都能成功,open函数依次选取下⼀个空闲的⽂件描述符,分配给⽂件fl 、f2、

f3, 因此输出为“ fd1=3 fd2=4 fd3=5

#include "wrapper.h"
int main()
{
      int fd1,fd2,fd3;
      fd1=Open("f1",O_RDWR|O_CREAT,0777);
      fd2=Open("f2",O_RDWR|O_CREAT,0777);
      fd3=Open("f3" ,O_RDWR|O_CREAT,0777);
      printf("fd1=%d  fd2=%d  fd3=%d\n",fd1,fd2,fd3);
      Close(fd1);
      Close(fd2);
      Close(fd3);
}

数据结构共享

打开同一文件两次

内核打开文件数据变化

函数open/close/dup/dup2执⾏后⽂件描述符表的变化情况

练习

fd1=3 fd4=4 fd3=5 fd4=0


 

loc1=10 ch=k, loc2=27

fd2=4

fd3=0

fd3=0是因为dup函数会返回最小的未使用的文件描述符。当你关闭了标准输入(文件描述符0),那么0就成了最小的未使用的文件描述符,所以dup函数会返回0。这样,fd3就和标准输入指向了同一个文件。
 
如果你想让fd3指向一个不同的文件,你可以使用dup2或dup3函数,它们可以让你指定新的文件描述符的值。