unix c编程:不带缓冲的文件 I/O总结

open、create、lseek、read、write、pread、pwrite、dup、dup2、sync、fsync、fdatasync
open操作

#include<fcntl.h>
int open(const char* pathname,int flags,mode_t mode);

作用:以各种方式打开文件
返回值:返回打开的文件句柄(一般会大于0),-1 打开失败
第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用
输入参数说明:
pathname : 文件路径
flags: rwx操作必选,其他为可选操作
mode: 使用了O_CREAT时,rwx初始化权限设置
access和mode的可取值通常在FCNTL.h里面定义,access的可取值如下:

#define O_RDONLY          1
#define O_WRONLY          2
#define O_RDWR          4

access还可以是以下flag及它们之间的组合而得到的性质:

#define O_CREAT         0x0100     /* create and open file */
#define O_TRUNC         0x0200     /* open with truncation */
#define O_EXCL         0x0400     /* exclusive open */
#define O_APPEND        0x0800     /* to end of file */
#define O_CHANGED       0x1000     /* user may read these bits, but     */
#define O_DEVICE       0x2000     /* only RTL/io functions may touch.     */
#define O_TEXT         0x4000     /* CR-LF translation     */
#define O_BINARY       0x8000     /* no translation     */ 

create操作

int create(char* pathname,mode_t mode)

作用:创建一个新文件,若成功则返回文件句柄(一般会大于0),否则返回-1。
参数:pathname为文件名,mode为模式
close

int close(int fd);

作用:关闭文件,若文件顺利关闭则返回0, 发生错误时返回-1.
lseek

off_t lseek(int filde, off_t offset, int whence);

作用:定位文件操作位置,若成功则返回定位位置,否则返回-1。
输入参数说明:
filde :文件描述符
offset:偏移位置,带符号整型数据
whence:定位。SEEK_SET 开头;SEEK_CUR 当前位置;SEEK_END 结尾
read

ssize_t read(int fd, void *buf, size_t count);

作用:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
参数说明:fd 文件描述符;buf 存储数据指针;count 需要读取字节数
write

ssize_t write(int fd, const void *buf, size_t nbyte);

作用:成功返回写入的字节数,出错返回-1并设置errno。
参数说明:fd 文件描述符;buf 存储数据指针; nbyte 需要写入字节数

read与write注意事项:一般读写一页时,I/O效率最佳,32位系统一页一般为4096 Byte

pread

扫描二维码关注公众号,回复: 1706235 查看本文章
ssize_t pread(int fd, void *buf, size_t count, off_t offset);

作用:读取指定位置的内容,成功返回读取的字节数,出错返回-1并设置errno
参数说明:fd 文件描述符;buf 存储数据指针;count 需要读取字节数,offset为偏移量
注意,执行后,文件偏移指针不变
pwrite

ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

作用:向指定位置写入内容,成功返回写入的字节数,出错返回-1并设置errno
参数说明:fd 文件描述符;buf 存储数据指针;count 需要写入字节数,offset为偏移量
注意,执行后,文件偏移指针不变
pread与pwrite都是原子操作,不需要考虑临界区问题。

dup与dup2

int dup(int fd);
int dup2(int oldfd,int newfd);

作用:两个均为复制一个现存的文件的描述,若成功为新的文件描述,若出错为-1;
dup返回的新文件描述符一定是当前可用文件描述中的最小数值。
dup2则可以用newfd参数指定新的描述符数值。如果newfd已经打开,则先关闭。
通常使用这两个系统调用来重定向一个打开的文件描述符

sync与fsync,fdatasync
大多数磁盘的I/O操作通过缓冲区进行,写入数据时,先将数据放入缓冲区,然后排入队列,然后等待写入磁盘
int sync(void); 将所有修改过的缓冲区排入队列,然后返回(不会等待写入磁盘)
int fsync(int fd); 将制定文件修改写入磁盘,然后返回
int fdatasync(int fd); 将制定文件修改写入磁盘,然后返回(只更新数据,sync会同步更新文件属性)

ioctrl
与驱动相关的操作,具体的实现在kernel driver完成

文件描述符在/dev/fd/下显示

猜你喜欢

转载自blog.csdn.net/ly601579033/article/details/80661080