对外的输入与输出—文件IO

前言

文件io是操作系统对外封装的一组用户使用的系统函数,他不在文件缓存系统之中在所有io操作过程是中没有缓存区的存在,他是由文件描述符调用的,同时文件描述符是从3开始前面的分别是stdin(标准输入),stdout(标准输出),stderr(无缓存)

文件io和标准io区别的再理解

标准的io的效率更高,因为他存在缓存区

区别在于,文件io的响应速度快,标准io的吞吐量大

标准io和文件io不可混用

转换函数 fileno fdpoen 可以将标准io转换为文件io

文件io的打开
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

打开函数
int open (const char *pathname,int flags)

功能是可以指定方式打开指定路径+文件的名称的文件
flags 打开文件的方式
O_RDONLY 只读
O_WEONLY 只写
0_RDWR 读写

要求文件必须存在
返回值:成功 返回文件描述符 失败 -1
同时一个进程最多同时打开1024个文件
文件描述符他其实就是一个数组的下标,每打开一个文件,就有一个目前最小的文件描述符被使用,同时它默认打开3个文件描述符,他的范围是0~1023

0 标准输入
1 标准输出
2 标准错误

同时还有很多宏在man手册中使用 同时在使用O_CREAT的时候,系统会有一个掩码,会帮你删掉其他用户的可执行权限
比如你给的是666 ---- rw-rw-rx-之后就会变成 664 ----- rw-rw-r–

关闭函数

#include <unistd.h>
int close (int fd)
功能:用来关闭指定文件描述符
但是这个和标准io不同的是,这个可以关多次,不会造成内存泄漏
返回值 成功 0 失败 -1

文件io的读取

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
功能:通过该函数可以从fd指定的文件中获取长度为
count字节的数据到buf所在的本地内存。
参数:fd 要读数据的文件描述符。
buf 用来存储读到的数据。
count 控制读的数据长度,单位字节。
返回值:成功 返回获取到的数据长度,一般小于等于count
失败 -1
文件结尾 0
其中 ssize_read 是无符号int类型,如果要打印他的数需要使用%zd
如果使用的read函数来获得标配输入的,可以将文件描述符改为0;及标准输入stdin

文件io的写入

ssize_t write(int fd, const void *buf, size_t count);
功能:向指定的fd文件中写入长度为count字节的数据。
参数:fd 文件描述符
buf 要写入文件的信息。
count 要写入文件的数据长度,单位字节。
返回值:成功 返回写入的数据长度
失败 -1

文件定位操作

off_t lseek(int fd, off_t offset, int whence);
功能:在fd所在的文件中移动其文件指针到指定位置。
参数:fd 要移动文件指针的文件描述符
offset 移动的偏移量,> 0 向文件末尾偏移
< 0 向文件开头偏移
= 0 文件指针不动
whence 移动的起始位置,有如下三个宏。
SEEK_SET 文件开头位置
SEEK_CUR 文件当前位置
SEEK_END 文件末尾位置
返回值:成功 返回移动后指针距离文件开头位置的字节数。
失败 -1
他不会出现像fseek中偏移越过尾会出现空洞文件,也不会在偏移越过头导致失败

open的其他操作:

int open(const char *pathname, int flags, mode_t mode)
功能:完全类似于open两个参数的效果,都可以打开指定路径+名称
的文件并返回其文件描述符。
参数:pathname 文件路径+ 名称
flags 在原有O_RDONLY O_WRONLY O_RDWR的基础上可以继续
新增加如下flags:
O_CREAT O_EXCL O_TRUNC O_APPEND
创建 检测 清空 追加
所有的flags都以位或运算的方式设置。
mode 文件的权限,主要用于flags如果有O_CREAT 的时候生效。
mode_t 是八进制的整数类型。
返回值:成功 返回文件描述符
失败 -1

强制位和黏滞位

强制位:在拥有者或拥有组的可执行权限上再加一个s
如果文件上有s,那他就可以给任何一个用户,都以文件的拥有者来使用
在执行文件拥有者的权限

黏滞位:在其他用户的可执行权限上加一个t
一般用在共享文件上,任何人都可以添加和删除自己的文件,没有去权限修改别人的,但是root用户除外

如果在可执行的文件上显示的是大写的S或T的话,就表示文件没用可执行的权限,这时候s和t就没用意义
拥有者 s 100 4
拥有组 s 010 2
其他用户 t 001 1

例子:
	rwsrwxrwx	4777
	rwxrwsrwt	3777
	
	--s--s--t	7111
	  4  2  1
	  
	--S--S--T	7000
	  4  2  1

文件权限本质上是四个8进制数
.1强制位,粘滞位
.2拥有者权限
.3拥有组权限
.4其他用户权限

文件描述符的

int dup(int oldfd);

可以理解为复制一份文件描述符,使得两个文件描述符都指向同一个文件,占用的是最小的描述符,如果失败,返回-1,并且设置errno
在多进程和对线程的地方,最好不要使用,因为他不是一个原子操作

int dup2(int oldfd, int newfd); //文件描述符的重定向
文件描述符的重定向重定向到另一个文件描述符上,并且会关闭之前的文件,返回的是新的文件描述符,失败返回-1,并设置errno
将 oldfd 用 newfd代替

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值