【Linux】系统文件IO&&文件描述符


在学C语言时就有涉及到文件操作----标准文件IO,在Linux中又接触了标准文件IO,大概先将

标准文件IO与系统文件IO做个对比

标准文件IO:fopen()、fclose()、fread()、fwrite()、fseek()
系统文件IO:open()、close()、read()、write()、lseek()

标准文件IO都是C标准库当中的函数,称之为库函数,是对系统调用的封装,方便二次开发
系统文件IO都属于系统提供的接口,称之为系统调用接口

标准文件IO只能读写普通文本文件和二进制文件,
系统文件IO不仅可以读写普通文件和二进制文件,还可以读写系统底层设备文件;加锁的文件必须使用系统文件IO读写,特殊的文件,比如管道,socket也必须使用read、write系统文件IO读写

标准文件IO读写文件的时候使用缓冲区的
系统文件IO读写文件的时候不使用缓冲区

标准文件IO中标准输入、输出、错误是stdin、stdout、stderr
系统文件IO中标准输入、输出、错误对应的是0、1、2文件描述符(后面有讲解)

系统调用接口介绍

open()

#include<sys/types.h>
#include<sys/stat.h>
#include<fctnl.h>
int open(const char *pathname,int flags);//pathname是要打开或创建的文件目标,flags是以什么方式打开
int open(const cha *pathname,int flags,mode_t mode);

flags参数:
O_RNONLY //只读
O_WRONLY //只写
O_RDWR//读写

O_CREAT 若文件不存在,则创建它,需要mode来设置权限(这样设置 mode &…umask)
O_APPEND 追加写

write

#include<unistd.h>
ssize_t write(int fd,const void *buf,size_t count);//fd文件描述符,buf要输入的数据,count要写入的字节数

成功返回实际写入的字节数,失败返回-1
read

#include<unistd.h>
ssize_t read(int fd,void *buf,size_t count);

close

#include<unistd.h>
ssize_t close(int fd);//关闭后就不再指向任何文件了,可以在新的文件操作中被使用

lseek 跳转到fd文件的读写位置指定处

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

whence: SEEK_SET(文件夹) SEEK_CUR(当前) SEEK_END(文件尾)

文件描述符fd

linux下一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,是从0开始的小整数,指被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符完成的
需要知道下面三点:
1.进程执行open系统调用来打开文件,所以进程必须和文件关联,每个进程都有一个指针*files,指向一张表file_struct,该表中包含一个指针数组,每个元素都是一个指向打开文件的指针。所以本质上,文件描述符就是该数组的下标,只要拿着文件描述符,就可以找到对应的文件。
2.当我们打开文件时,操作系统要在内存中创建相应的数据结构来描述该文件,所以产生了file结构体,表示一个已经打开的文件对象。
3.在程序刚启动时,Linux进程下默认有三个文件描述符,是 0、1、2,分别代表标准输入、标准输出、标准错误,对应的物理设备一般是:键盘、显示器、显示器,当我们再打开一个新文件时,它的文件描述符就为3,依次。
在这里插入图片描述
文件描述符分配规则
先来看个代码:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stst.h>
#include<fcntl.h>
int main()
{
  close(1);
  int fd=open("./test.txt",O_RDONLY);
  if(fd<0)
  {
  perror("open error");
  return 1;
  }
 printf("fd: %d\n",fd);//1
 return 0}

分配规则:使用当前没有被使用的最小的下标
1被关闭,这是最小且没有被使用的描述符为1,所以打开文件.txt文件时被分配到1中,1作为.txt的新的文件描述符

重定向

假如有个数据,原本要把它输出到屏幕上,现在重新定向到某个指定的文件中。这就叫重定向,所以当我们不想直接在显示器上看见输出,就可以把它重定向到某个文件中

  • 重定向指文件描述符的重定向,文件描述符这个下标中的文件描述信息,从一个文件变成另一个文件
  • 注:文件描述符没有变,只是描述符的下标信息变了,导致数据到另一个文件中去了

输出重定向(覆盖): >
输出重定向(追加):>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值