Linux相关系统io的部分函数
file descriptor (文件描述符,一般简写为 fd)
文件描述符 对应的宏
标准输入文件(和标准输入有关) 0 STDIN_FILENO
标准输出文件(和标准输出有关) 1 STDOUT_FILENO
标准出错文件(和标准出错有关) 2 STDERR_FILENO
errno
errno是系统变量(是系统帮该程序/进程定义的一个全局变量),他是一个整数,不同的值代表不同的系统错误(errno也叫错误码),当系统函数发生
某个错误的时候,就会自动把errno设置为这个错误对应的错误码,并且提供了一个函数用来打印对应的错误信息这个函数是 : perror
open函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int open(const char *pathname, int flags);
flags
O_RDONLY:只读方式打开文件。
O_WRONLY:只写方式打开文件。
O_RDWR:可读可写方式打开文件。
O_CREAT:如果文件不存在,则创建文件。
O_EXCL:与O_CREAT一起使用,如果文件存在则返回错误。
O_TRUNC:打开文件时截断文件,即清空文件内容。
O_APPEND:如果直接读会在头部,写入文件时才追加到文件末尾。
O_NONBLOCK:以非阻塞模式打开文件。
O_SYNC:每次写入文件都将数据同步到底层设备。
O_NOCTTY:如果路径名称指向终端设备,不将该设备分配作为进程的控制终端。
int open(const char *pathname, int flags, mode_t mode);
O_CREAT,只有flags为这个时才用这个函数
mode_t mode
mode:
指定创建之后这个文件的属性中的权限(ls -l 显示的那9种权限)
有两种方式指定,宏或者8进制数字
具体:
S_IRWXU 00700 user (file owner) has read, write, and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write, and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
close函数
#include <unistd.h>
int close(int fd);
fd:要关闭的文件描述符
返回值:
成功返回0
失败返回-1
read函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符,对应一个文件,表示从这个文件中读取数据
buf:首地址,指向的内存用来保存读取到的内容
为什么是 void*,而不是 char*或者int*呢?
原因是不确定读取的数据是什么类型,可能是字符串,也可能是Int,也可能是double .....
count:数量,以字节为单位,表示想要读取 count个字节的数据
返回值:
成功返回:大于0,返回实际读取到的数据
等于0,已经到文件末尾,没有数据可读
失败返回: -1 ,读取过程中发生错误
write函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd :文件描述符,对应一个文件,表示往这个文件中写入数据
buf:一块内存的首地址,这块内存中保存了将要写入文件的数据
count: 你想要往文件中写入多少个字节的数据
返回值:
失败返回-1,同时errno被设置
成功返回实际写入的字节数目
lseek函数
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符,对应一个文件,表示定位这个文件的光标
offset:偏移量,以字节为单位,正数往后,负数往前
whence:定位方式,有三种情况
SEEK_SET 以文件开头为基准进行偏移
新光标位置=文件开头+offset
SEEK_CUR 以当前光标位置为基准进行偏移
新光标位置=当前光标位置+offset
SEEK_END 以文件末尾为基准进行偏移
新光标位置=文件末尾+offset
其他函数
truncate/ftruncate 截短文件
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
把文件截短变为 length字节(保留前面 length个字节)