linux文件IO,系统调用汇总

1 函数open和opent

调用open或者opent函数可以打开或者创建一个文件

#include<fcntl.h>
int open(const char*path,int oflag,..../* mode_t */);//1.path 文件路径 2.oflag 选项 3.mode_t 可选值,一般为文件权限

int openat(int fd,const char *path,int oflag,..../*mode_t*/);//1.fd 文件描述符 2.path 路径 3.oflag 路径 4.mode_t可选值
1.open和openat函数一般返回的是当前文件描述符中的最小值
2.path指定的是绝对路径的时候,fd参数将被忽略,这时候opent函数与open函数无差别
3.path指定的是相对路径的时候,fd参数指出了相对路径在文件系统中的开始地址。fd 参数是通过打开相对路径名所在的目录来获取的
4.path参数指定了相对路径名,fd参数具有特殊值AT_FDCWD.在这种情况下,路径名所在的当前工作目录中获取,openat函数在操作上与open函数类似
5.当我们试图在当前目录中创建一个文件名,文件名的长度超过了,NAME_MAX 的时候。会出现两种结果1.文件名会被截断。2.返回一个出错。这取决于 选项中的 _POSIX_NO_TRUNC是否有效,如果其值大于0则说明有效,则其选项为2也就是出错。并且会将erron设置为ENAMETOOLONG.
如果其值=0,则需要调用pathconf或者fpathconf函数来查看。
常量选项说明
O_RDONLY只读打开
O_WRONLY只写打开
O_EXEC只执行打开
O_SEARCH只搜索打开(应用于目录)
####################以上只能指定一个##############
O_APPEND每次写时都追加到文件的尾端
O_CLOEXEC把FD_CLOEXEC常量设置为文件描述符标志
O_CREAT若此文件不存在,则创建它。使用此选项时,函数必须说明 mode参数,用mode指定该新文件的访问权限
O_DIRECTORY如果path引用的不是目录则出错.
O_EXCL如果同时指定了O_CREAT,而且文件已经存在,则出错。用此可以测试一个文件是否存在,如不存在则创建它。同时保证了原子操作.
O_NOCTTY如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端
O_NOFOLLOW如果path引用的是一个符号链接,则出错.
O_NONBLOCK如果path引用的是一个FIFO,一个块特殊文件或者一个字符特殊文件,则本次打开的操作和后续的IO操作设置非阻塞方式
O_SYNC使每次write操作,需要等待物理IO操作完成,包括由该write操作引起的文件属性更新
O_TRUNC如果此文件存在,而且为只写或者读写打开,则将其长度截断为0
O_TTY_INIT如果打开一个还未打开的终端设备,设置非标准termios的参数值,使其符号 sus
O_DSYNC使每次write操作,需要等待物理IO操作完成,但无需等待文件属性的更新
O_RSYNC使每一个以文件描述符作为参数进行的read操作等待,直到所有对文件同一部分挂起的写操作都完成.同步读操作

2 函数creat

#include<fcntl.h>
int creat(const char*path,mode_t mode);//1.path 文件路径和文件名 2.mode 文件权限

1.creat 创建会返回一个文件描述符,但是只读状态打开的。
2.此函数等价于 open(path,O_RDWR|O_CREAT|O_TRUNC,mode);

3 函数close

#include<unistd.h>
int close(int fd); //1.fd 文件描述符

1.关闭一个文件时,还会失望该进程在该文件上所有的记录锁。
2.当进程关闭时候,他会自动关闭它所打开的所有文件.

4 文件当前偏移量 函数lseek

​ 每打开一个文件,该进程都会维护一个该文件的偏移量,后续的读写操作都是从当前文件偏移量开始的。除非打开的时候,指定了O_APPEND选项,否则该文件偏移量都被设置为0.

#include<unistd.h>
off_t lseek(int fd,off_t offset,int whence);//1.fd 文件描述符 2.offset 数值 3. whence 操作方式

1.若whence为SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
2.若whence为SEEK_CUR,则将该文件的偏移量设置为当前值+offset,其中offset可正可负
3.若whence为SEEK_END,则将该文件的偏移量设置为文件长度+offset,其中offset可正可负
4.若lseek成功执行,则返回当前文件的偏移量,如果返回-1则说明当前文件不可进行设置偏移量,并将errno设置为ESPIPE

根据上述的特性,可以使用下述代码来查看当前文件的偏移量.

off_t currpos;
currpos=lseek(fd,0,SEEK_CUR);

​ 文件的偏移量可以大于,当前文件的长度,在这种情况下,对该文件的下一次写将加长该文件,并且在文件中构成一个空洞。位于文件中但没有写过的字节都被读成0.对于文件中空洞,并不要求在磁盘上占有存储区。具体的处理方式与文件系统有关,当定位超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。

5 函数read

调用read函数从打开文件中读取数据

#include<unistd.h>

ssize_t read(int fd,void *buf,size_t nbytes);//1.fd 打开的文件描述符 2.buf 用于存储读取到的数据的缓存区 3.nbytes 要求读到的字节数

1.如果read成功,将返回读到的ssize_t字节数.

2.如果返回0则代表已经读到文件尾部。

3.如果返回 -1 则代表出错

6 函数write

调用write函数向打开文件写数据

#include<unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes);//1.fd 打开的文件描述符 2.buf 存储要写的数据的指针 3.nbytes 要写入的数据长度 单位字节

1.返回值参数通常与 nbytes相同,如果不相同表述出错.

2.出错的原因一般是 磁盘写满或者超过了一个给定进程的文件长度限制

3.如果打开文件的时候,指定了O_APPEND选项,则每次写操作之前,都会将该文件的偏移量设置在文件当前的结尾处。并且偏移量增加实际的写字节数

7 函数pread和pwrite

#include<unistd.h>

ssize_t pread(int fd,void *buf,size_t nbytes,off_t offset);//1.fd 文件描述符 2.buf 存储读到的数据 3.nbytes 要读出的字节数 4.offset 文件偏移量

ssize_t pwrite(int fd,void *buf,size_t nbytes,off_t offset);//1.fd 文件描述符 2.buf 存储要写的数据 3.nbytes 要读出的字节数 4.offset 文件偏移量


1.此两个函数和read以及write的区别是,从文件开头到offset的位置开始读写,但不改变文件的偏移量.

8 文件共享

关于文件共享 ,主要有以下几点注意事项和概念.

1.每个进程都会有独立的记录表项,该表维护了当前进程所有的文件描述符。

2.每个文件描述符,都会指向一个打开的文件表项。

3.当在一个进程中,多次打开同一个文件,如果文件打开状态是相同的,则他们会返回不同的文件描述符,但每个文件描述符都会指向一个相同的文件表项。只有当open时候的文件打开状态不同的时候,才会指向不同的文件表项。

4.不同的进程打开同一个文件的时候,会有相互独立的文件表项,无论是什么状态打开的。

9 函数dup和dup2

下面两个函数都可以复制一个文件描述符

#include<unistd.h>
int dup(int fd);//1.fd 要复制的文件描述符标志
int dup2(int fd,int fd2);//1.fd 要复制的文件描述符标志 2.fd2 指定新文件描述符标志

1.由dup返回的新文件描述符标志,一定是当前可用最小的

2.如果fd2已经打开,则先将其关闭。如果fd2=fd则不关闭.否则,fd2的FD_CLOEXEC文件描述符标志就被清除,这样在程序退出时,时是打开的。

3.新描述符的执行时关闭,总是由dup函数清除.

10 函数 sync、fsync和fdatasync

对操作系统而言,虽然标志文件io确实没有缓存区,直接写入磁盘。但操作系统内核,为了io的优化,并不会直接写入磁盘中,而是在内核中维护了一块告诉缓存,内核通常会将数据复制到缓存区中,然后排队依次。稍晚的时候再写入磁盘。这种方式被称为延迟写。当系统需要重用,缓存区来存放其它磁盘块的数据时,它会把延迟写数据写入磁盘。为了保证磁盘上时间的文件系统与缓存区内容一样。提供了如下三种函数.

#include<unistd.h>

int fsync(int fd);//1.fd 文件描述符

int fdatasync(int fd);//1.fd 文件描述符

void sync(void);

1.sync函数只是将所有修改过的块缓存区排入写对了,然后就返回,它并不等待实际的写磁盘操作结束。通常称为update的系统守护进程周期性的调用(一般间隔30s)sync函数.

2.fsync函数只对由文件描述符fd指定的一个文件起作用.并且等待磁盘写操作完成才返回.

3.fdatasync函数类似于fsync,但他影响的只是文件的数据部分。而除了数据外,fsync还会同步更新文件的属性.

11 函数fcntl

fcntl函数可用改变已经打开文件的属性

#include<fcntl.h>

int fcntl(int fd,int cmd...../*int arg*/);//1.fd 要操作的文件描述符 2.cmd 选项 3. agr附加可选项

1.fcntl的返回值,与命令有关。如果出错,所有命令返回-1,如果成功返回某个其它的值

选项作用
F_DUPFD复制文件描述符fd。新文件描述符作为函数返回值。它是尚未打开的各描述符中大于或者等于第3个参数值张最小的新描述符,并且新的描述符与fd共享同一个文件表项。但是新文件描述符有自己的一套文件描述符标志。
F_DUPFD_CLOEXEC复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值,返回新的文件描述符。
F_GETFD返回对应于fd的文件描述符的标志作为函数返回。当前只定义了一个文件描述符标志FD_CLOEXEC
F_SETFD对于fd设置文件描述符标志。新标志按照第三个参数传递。
F_GETFL对应于fd的文件状态标志作为函数返回值。其主要是定义的open函数的文件描述符标志.遗憾的是前5个文件状态,互斥,并不是各占1位。因此选择用屏蔽字O_ACCMODE.取得访问方式位。使用方法为(val&O_ACCMODE)
F_SETFL将文件状态标志设置为第3个参数的值。可以更改的标志不能是前5位.
F_GETOWN获取当前接收的SIGIO和SIGURG信号的进程ID和进程组ID。
F_SETOWN设置接收SIGIO和SIGURG信号的进程ID和进程组ID。正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程组ID
  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值