文件输入输出操作
文件打开
#include<sys/types.h>
#include<sys/stat.h>
int open(const char *path,int flags);
int open(const char *path,int flags,mode_t mode);
//打开或创建的文件的文件名 打开文件的参数
成功返回文件描述符,失败返回-1,错误代码存入errno
flags参数
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
三者互斥,只能选择一种O_CREAT 文件不存在自动自动创建该文件,不过此时需要第三个参数mode
O_EXCL O_CREAT被设置时,检测文件是否存在。不存在则创建,存在则打开文件失败
O_TRUNC 文件存在并以可写的形式打开,自动清0
O_APPAND 写入的文件以追加的形式加在文件后面
O_SYNC 同步的方式打开文件,文件修改直到物理磁盘数据同步后返回
O_NOFOLLOW 如果文件为符号链接,则打开文件失败
O_DIRECTORY 如果文件不是目录,则打开失败
文件创建
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int create(const char *pathname,mode_t mode);
// 打开或创建的文件 文件读取权限mode(mode &~ umask)(八进制)
成功返回文件描述符,失败返回-1,错误代码存入errno
create();只能以可写的形式创建文件,与参数无关
文件关闭
#include<unistd.h>
int close(int fd);
//要关闭的文件描述符
成功返回0,失败则返回-1,错误代码存入errno
读文件
#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//文件描述符 指向的缓冲区 写入的字节个数
成功则返回0,失败则返回-1,错误代码存入errno
写文件
#include<unistd.h>
ssize_t write(int fd, void *buf, size_t count);
//文件描述符 指向的缓冲区 读取的字节个数
成功则返回0,失败则返回-1,错误代码存入errno
文件指针的移动
#include<sys/types.h>
#include<unistd.h>
off_t lseek(int fd, off_t offset, int whence);
//文件描述符 指针移动到对于参数whence表示的位置的偏移量 表示要将指针移动到的位置的参考位置
文件描述符 指针移动到对于参数whence表示的位置的偏移量 表示要将指针移动到的位置的参考位置
SEEK_SET 从文章开始处计算偏移量,距离为offset
SEEK_CUR 从文件指针的当前位置计算偏移量,文件指针值为当前指针值加上offset,offset可以取负数
SEEK_END 从文件的结尾计算偏移量,offset可以取负数
文件复制
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
//要复制的文件描述符
成功返回最小的尚未被利用的最小文件描述符,失败则返回-1,错误代码存入errno
文件控制
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd, int cmd, ...);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
//文件描述符 需求
fcntl函数根据cmd参数的不同有不同的功能,但都对fd表示的文件描述符进行操作。
F_DUPFD 复制由fd指向的文件描述符
F_GETTFD 获取文件描述符的close-on-exec标志
F_SETFD 获取文件描述符的close-on-exec标志为第三个参数arg的最后一位
F_GETFL 获取文件打开的方式
F_SETFL 设置文件打开方式为第三个参数arg制定方式
struct flock{
short_l_type; //锁的类型
short_l_whence; //偏移量的起始位置
off_t_l_start; //开始的偏移量
off_t_l_len; //锁的字节数
pid_t_l_pid; //锁的主进程id
}
F_SETLK 设置或者释放锁
F_SETLKW 设置或者释放锁 ,不过需要等到冲突锁释放
F_GETLK 第三个参数表示想修改的锁的属性的结构
F_GETOWN 返回当前接收SIGIO或SIGURG信号的进程ID或进程组
F_SETOWN 返回设置当前接收SIGIO或SIGURG信号,进程组ID为负数指定,进程ID用正数指定
F_GETSIG 可在输入输出时,获得发送的信号
F_SETSIG 设置输入输出发送的信号
设备控制
#include<sys/ioctl.h>
int ioctl(int fd, int request, ...);
// 文件描述符 要进行的操作,视参数的不同还需要在这里添加其他参
文件属性操作
获得文件属性
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char *restrict path, struct stat *buf);
int fstat(int fd, struct *buf);
int lstat(const char *restrict path, struct stat *buf);
// 要获得文件属性的文件的路径 文件信息结构体
若执行成功则返回0,失败则返回-1,错误代码存入errno
struct stat *buf{
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_size;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
}
设置文件归属(设置文件所属的用户和用户组。)
#include<sys/types.h>
#include<unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
//要设置的文件的路径 文件所属的用户 文件所属的用户组
//文件描述符 文件所属的用户 文件所属的用户组
若执行成功则返回0,失败则返回-1,错误代码存入errno
改变文件大小
#include<unistd.h>
#include<sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
//要改变长度的文件的路径 新的文件长度。若比原来的长度短,则截断文件,若比原来的长度长,则以二进制0填充。
改变文件修改时间
//要改变长度的文件的文件描述符 新的文件长度。若比原来的长度短,则截断文件,若比原来的长度长,则以二进制0填充。
改变文件修改时间
若执行成功则返回0,失败则返回-1,错误代码存入errno
改变文件的访问时间和更改时间
#include<sys/types.h>
#include<unistd.h>
int utime(const char *path,struct utimbuf *buf);
//要改变修改时间的文件的路径 新的访问时间和更改时间。若指定为NULL则不改变
若执行成功则返回0,失败则返回-1,错误代码存入errno
权限屏蔽字
#include<sys/stat.h>
#include<sys/types.h>
int umask(mode_t mask);
//要设置的新的屏蔽字
返回原来的屏蔽字。
移动/删除文件
#include<inistd.h>
#inlcude<stdio.h>
int rename(const char *old, const char *new);
int unlink(const char *path);
int remove(const char *path);
//文件的旧路径 文件的新路径
//要删除的文件路径
若执行成功则返回0,失败则返回-1,错误代码存入errno