文件IO
系统默认分配的3个描述符
#define STDIN_FILENO 0 /* 标准输入文件描述符 */
#define STDOUT_FILENO 1 /* 标准输出文件描述符 */
#define STDERR_FILENO 2 /* 标准错误输出文件描述符 */
相关API
/* 头文件 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* 函数原型 */
int open(const char *pathname, int flags); /* 打开已经存在的文件 */
int creat(const char *pathname, mode_t mode); /* 创建新的文件 */
/**
* [open 打开已经存在的文件]
* @param pathname [需要打开或者创建文件的路径名称(可以是相对路径,也可以是绝对路径)]
* @param flags [
* 打开文件的方式
* 1) 必须包含且仅包含其中一个:
O_RDONLY: 只读
O_WRONLY: 只写
O_RDWR: 可读写
2) 可选择宏定义:
O_CREAT: 创建文件标志
(1) O_CREAT 文件不存在则创建文件并打开,文件存在则直接打开文件;
(2) O_CREAT | O_EXCL 文件不存在则创建文件并打开,文件存在则报错。
(3) O_CREAT | O_TRUNC 文件不存在则创建文件并打开,文件存在直接打开文件并将原文件中内容清空。
(4) O_CREAT | O_APPEND 文件不存在则创建文件并打开,文件存在则直接打开文件并将写指针移动到文件末尾(追加)。
O_NONBLOCK:打开文件将其设置为非阻塞模式,在默认情况下如果没有使用O_NONBLOCK则为阻塞模式。
O_NOCTTY:表示以非终端模式打开文件(一般指的是串口文件的打开)
* ]
* @param mode [mode用来设置文件的权限(只有在创建文件的时候才有效,并且文件的权限 = mode & ~umask)]
* @return [成功返回文件描述符;
失败返回-1,且修改errno的值(perror输出错误消息); ]
*/
int open(const char *pathname, int flags, mode_t mode);
#include <unistd.h>
/**
* [close 关闭文件]
* @param fd [需要关闭的文件描述符]
* @return [成功返回文件描述符;
失败返回-1,且修改errno的值(perror输出错误消息)]
*/
int close(int fd);
#include <unistd.h>
/**
* [read 读文件数据]
* @param fd [文件描述符]
* @param buf [指向的空间用来存储读取到的数据]
* @param count [表示期望读取数据的字节数;
count为0,返回0表示没有读取数据;
count>SSIZE_MAX,则按照SSIZE_MAX读取;]
* @return [
* 成功读取数据的字节数,
返回0表示没有数据可读,表示结束;
返回-1,表示读取数据失败
]
*/
ssize_t read(int fd, void *buf, size_t count);
#include <unistd.h>
/**
* [write 写文件]
* @param fd [文件描述符]
* @param buf [指向的是需要写入文件的数据]
* @param count [期望写入文件数据字节数]
* @return [成功返回写入文件字节数,失败返回-1,且修改errno的值]
*/
ssize_t write(int fd, const void *buf, size_t count);
#include <sys/types.h>
#include <unistd.h>
/**
* [lseek 文件指针定位]
* @param fd [文件描述符]
* @param offset [表示的是偏移量,如果为负数向前偏移,正数向后偏移]
* @param whence [偏移基准 SEEK_SET起始位置 SEEK_CUR文件的当前位置 SEEK_END文件的结束位置]
* @return [成功返回是起始位置到偏移后的当前的位置;失败返回(off_t)-1且修改errno的值]
*/
off_t lseek(int fd, off_t offset, int whence);
#include <unistd.h>
#include <fcntl.h>
/**
* [fcntl 控制已经打开文件的阻塞和非阻塞模式]
* @param fd [文件描述符]
* @param cmd [
* cmd表示的是文件的控制命令,决定对文件的操作方式。
* fcntl函数有5种功能:
1) 复制一个现有的描述符(cmd=F_DUPFD)
2) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
3) 获得/设置文件状态标记(cmd=F_GETFL(void))或F_SETFL(int)))
4) 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
5) 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)
@param ... arg是由参数2来决定类型,可能void或者int类型
* ]
*/
int fcntl(int fd, int cmd, ... /* arg */ );
/* 将fd文件描述符指向的文件设置为非阻塞模式 */
/* 1. 获取文件的状态 */
flags = fcntl(fd, F_GETFL);
if (flags == -1) {
perror("fcntl->F_GETFL");
return -1;
}
/* 设置文件的状态为非阻塞态 */
ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
if (ret == -1) {
perror("fcntl->F_SETFL");
return -1;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/**
* [stat 获取文件属性]
* @param pathname [需要获取文件属性的文件名称(绝对路径和相对路径)]
* @param buf [
结构体指针用来返回文件的属性
struct stat {
dev_t st_dev; / ID of device containing file /
ino_t st_ino; / inode number /
mode_t st_mode; / protection /
nlink_t st_nlink; / number of hard links /
uid_t st_uid; / user ID of owner /
gid_t st_gid; / group ID of owner /
dev_t st_rdev; / device ID (if special file) /
off_t st_size; / total size, in bytes /
blksize_t st_blksize; / blocksize for filesystem I/O /
blkcnt_t st_blocks; / number of 512B blocks allocated /
Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES.
struct timespec st_atim; / time of last access /
struct timespec st_mtim; / time of last modification /
struct timespec st_ctim; / time of last status change /
#define st_atime st_atim.tv_sec / Backward compatibility /
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
]
* @return [成功返回0失败返回-1且修改errno的值]
*/
int stat(const char *pathname, struct stat *buf);
/*fstat函数功能,检测已经打开文件的属性,类似于stat。*/
int fstat(int fd, struct stat *buf);
/*lstat函数功能和stat函数类似,但是区别stat不能检测符号链接文件类型,lstat可以检测符号链接文件类型*/
int lstat(const char *pathname, struct stat *buf);
#include <sys/types.h>
#include <pwd.h>
/**
* [getpwuid 解析用户名称]
* @param uid [用户id号,使用stat函数返回结构体中st_uid成员]
* @return [
* 成功返回用户结构指针,失败返回NULL
* struct passwd {
char *pw_name; / username /
char *pw_passwd; / user password /
uid_t pw_uid; / user ID /
gid_t pw_gid; / group ID /
char *pw_gecos; / user information /
char *pw_dir; / home directory /
char *pw_shell; / shell program /
};
* ]
*/
struct passwd *getpwuid(uid_t uid);
#include <sys/types.h>
#include <grp.h>
/**
* [getgrgid 解析用户组名称]
* @param gid [用户组id号,使用stat函数返回结构体中st_gid成员]
* @return [
* 成功返回组结构指针,失败返回NULL
* struct group {
char *gr_name; / group name /
char *gr_passwd; / group password /
gid_t gr_gid; / group ID /
char **gr_mem; / NULL-terminated array of pointers
to names of group members /
};
* ]
*/
struct group *getgrgid(gid_t gid);
#include <unistd.h>
/**
* [readlink 解析符号链接文件的链接文件]
* @param pathname [文件路径]
* @param buf [存储内容]
* @param bufsiz [长度]
* @return [成功返回字符数 失败返回-1修改errno]
*/
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
#include <sys/types.h>
#include <dirent.h>
/**
* [opendir 打开目录]
* @param name [文件路径]
* @return [成功返回目录流指针,失败返回NULL且修改errno的值]
*/
DIR *opendir(const char *name);
/**
* [fdopendir 打开目录]
* @param fd [文件描述符]
* @return [成功返回目录流指针,失败返回NULL且修改errno的值]
*/
DIR *fdopendir(int fd);
#include <dirent.h>
/**
* [readdir 读目录]
* @param dirp [目录流指针]
* @return [
* 成功返回dirent结构体指针,失败和结束返回NULL
* struct dirent {
ino_t d_ino; / 索引节点号 /
off_t d_off; / 在目录文件中的偏移 /
unsigned short d_reclen; / 文件名长度 /
unsigned char d_type; / 目录类型 /
char d_name[256]; / 目录名 /
};
* ]
*/
struct dirent *readdir(DIR *dirp);
#include <sys/types.h>
#include <dirent.h>
/**
* [closedir 关闭目录]
* @param dirp [目录指针]
* @return [成功返回0,失败返回-1且修改errno的值]
*/
int closedir(DIR *dirp);
网友评论