说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Unix环境高级编程》、man 手册
目录:
- (1)open() —— 打开或创建文件
- (2)creat() —— 创建文件
- (3)read() —— 读取文件
- (4)write() —— 写入文件
- (5)lseek()——重新定位文件偏移量
- (6)close()—— 关闭文件
- dup()、dup2()与dup3()——复制文件描述符
- fgetc()、fgets()、getc()、getchar()、ungetc()——输入字符和字符串
- sync()、fsync()、fdatasync() ——缓冲区与磁盘同步
- fcntl()——控制文件描述符
- ioctl()——控制装置
- stat()、fstat()、lstat()——获取文件状态
- access()——检查文件权限
- umask()——设置文件模式创建掩码
- chmod()、fchmod()——改变文件权限
- chown()、 fchown()、lchown()——更改文件的所有权
- truncate()、ftruncate() —— 将文件截断为指定的长度
- link() ——为文件创建一个新名称(硬链接)
- unlink() —— 删除一个名称,可能还包括它引用的文件
- remove() —— 删除一个文件或目录【man 3 remove】
- rename()——更改文件的名称或位置
- symlink() —— 为文件创建一个新名称(软链接)
- readlink() —— 读取符号链接的内容
- utime()——更改文件的最后访问和修改时间
- mkdir() —— 创建一个目录
- rmdir() —— 删除一个目录
- opendir()、readdir()、rewinddir()、closedir()、telldir()、seekdir()【man 3 】
- chdir()、fchdir()——改变工作目录
- getcwd() —— 获取当前工作目录
文件描述符
打开/创建的文件均通过文件描述符引用,即文件标识符.
文件描述符为非负整数,范围:0~OPEN_MAX
标准文件描述符(定义于:unistd.h
):
①STDIN_FILENO
= 0 = 标准输入
②STDOUT_FILENO
= 1 = 标准输出
③STDERR_FILENO
= 2 = 标准错误
(1)open() —— 打开或创建文件
1.函数功能:打开或创建一个文件
项目 | 说明 |
---|---|
函数原型 | int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); |
头文件 | sys/types.h、sys/stat.h、fcntl.h |
参数说明 | pathname:文件名 |
flags:选项 (一个或多个或运算) | |
mode:访问权限位 | |
返回值 | 一个文件描述符(小的非负整数值) |
注意 |
2.flags常见选项:定义于:fcntl.h(还有很多)
flags | 功能 |
---|---|
O_RDONLY | 只读打开 |
O_WRONLY | 只写打开 |
O_RDWR | 读、写打开 |
O_APPEND | 每次写时都追加到文件尾端 |
O_CREAT | 若文件不存在则创建,需mode指定新文件的访问权限位。 |
(2)creat() —— 创建文件
1.函数功能:相当于调用带有O_CREAT|O_WRONLY|O_TRUNC标志的open()。
项目 | 说明 |
---|---|
函数原型 | int creat(const char *pathname, mode_t mode); |
头文件 | sys/types.h、sys/stat.h、fcntl.h |
参数说明 | pathname:文件名 |
mode:访问权限位 | |
返回值 | 一个文件描述符(小的非负整数值) |
注意 |
(3)read() —— 读取文件
1.函数功能:尝试从文件描述符fd
读取字节数count
到从buf
开始的缓冲区中。
项目 | 说明 |
---|---|
函数原型 | ssize_t read(int fd, void *buf, size_t count); |
头文件 | unistd.h |
参数说明 | fd:文件描述符 指向已打开文件的句柄 |
buf:缓冲区 指向一块用于存储的内存区域 | |
count:字节数 调用一次read,读取的字符个数 | |
返回值 | 成功返回读取到的字节数(0表示结束), 失败返回-1,并设置errno。 |
注意 | 对于支持寻址的文件,读取操作从文件偏移量开始,文件偏移量由读取字节数加1。 |
(4)write() —— 写入文件
1.函数功能:将count
字节的缓冲区buf
写入到文件描述符fd
所引用的文件。
项目 | 说明 |
---|---|
函数原型 | ssize_t write(int fd, const void *buf, size_t count); |
头文件 | unistd.h |
参数说明 | fd:文件描述符 指向已打开文件的句柄 |
buf:缓冲区 指向一块用于存储的内存区域 | |
count:字节数 调用一次read,读取的字符个数 | |
返回值 | 成功返回读取到的字节数(0表示结束), 失败返回-1,并设置errno。 |
注意 | 对于可查找的文件,在文件的偏移量处进行写入,并且文件偏移量增加实际写入的字节数。 |
(5)lseek()——重新定位文件偏移量
1.函数功能:每打开文件都有其相关联的“当前文件偏移量”(除指定O_APPEND
外默认为0),lseek()
将与文件描述符fd
相关联的文件偏移量依据whence
重新定位到offset
.
项目 | 说明 |
---|---|
函数原型 | off_t lseek(int fd, off_t offset, int whence); |
头文件 | sys/types.h、unistd.h> |
参数说明 | fd:文件描述符 指向已打开文件的句柄 |
offset:偏移量 (与whence相关) | |
whence:选项 SEEK_SET、SEEK_CUR 、SEEK_END | |
返回值 | 成功返回新文件偏移量, 失败返回-1,并设置errno。 |
注意 |
2.offset与whence的关系:
SEEK_SET:
文件偏移量设置为距文件开始处偏移offset
字节。
SEEK_CUR:
文件的偏移量设置为其当前位置加上偏移量offset
字节。
SEEK_END :
文件偏移量设置为文件大小加上偏移量offset
字节。
(6)close()—— 关闭文件
1.函数功能:关闭一个文件
项目 | 说明 |
---|---|
函数原型 | nt close(int fd); |
头文件 | unistd.h |
参数说明 | fd:文件描述符 指向已打开文件的句柄 |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 | 关闭文件时还会释放该进程加载该文件上的所有记录锁 |
dup()、dup2()与dup3()——复制文件描述符
1.函数功能:系统调用创建文件描述符oldfd的副本,使用新描述符中编号最少的未使用的文件描述符
项目 | 说明 |
---|---|
函数原型 | int dup(int oldfd); int dup2(int oldfd, int newfd); int dup3(int oldfd, int newfd, int flags); |
头文件 | unistd.h |
参数说明 | oldfd:文件描述符 |
newfd:文件描述符 (指定文件描述符) | |
flags:标记 | |
返回值 | 成功返回当前可用文件描述符中的最小数值, 失败返回非零 |
注意 | dup(fd) = fcntl(fd,F_DUPFD,0) dup3(fd,fd2) = close(df); fcntl(fd,F_DUPFD,fd2); |
fgetc()、fgets()、getc()、getchar()、ungetc()——输入字符和字符串
函数 | 函数原型与功能描述 | 参数说明 | 头文件 | 返回值 | 注意 |
---|---|---|---|---|---|
fgetc() | int fgetc(FILE *stream); 从流中读取下一个字符,并将其作为无符号字符转换为int型 | stream:文件流 s:缓冲区 size:字节大小 c:整型变量 | stdio.h | fgetc()、getc()和getchar()返回读取字符并转换为int类型。 fgets()成功返回s,失败时返回NULL; ungetc()成功返回c,在错误时返回EOF。 | |
fgets() | char *fgets(char *s, int size, FILE *stream); 最多从流中读取一个小于size的字符,并将其存储到s所指向的缓冲区中 | ||||
getc() | int getc(FILE *stream); 与fgetc()等价 | ||||
getchar() | int getchar(void); 与getc()等价 | ||||
ungetc() | int ungetc(int c, FILE *stream); 将c推回stream,转换为unsigned char,在这里它可用于后续的读操作 |
sync()、fsync()、fdatasync() ——缓冲区与磁盘同步
1.函数功能:将文件系统缓存提交到磁盘,保证磁盘上实际文件系统与缓冲区高速缓存中内容一致。
函数 | 函数原型与功能描述 | 参数说明 | 头文件 | 返回值 | 注意 |
---|---|---|---|---|---|
sync() | void sync(void); 仅将所有修改过块缓冲区排入写队列后返回,并不等待实际写磁盘结束 | fd:文件描述符 | unistd.h | sync()总是成功 成功返回0,失败返回-1,并设置errno。 | |
syncfs() | int syncfs(int fd); 类似sync(),但只同步包含被打开的文件描述符fd引用的文件的文件系统。 | ||||
fsync() | int fsync(int fd); 仅对fd文件起作用,并等待磁盘操作结束后返回 | ||||
fdatasync() | int fdatasync(int fd); 类似fsync(),但只影响文件数据部分,fsync(),还会同步属性 |
fcntl()——控制文件描述符
1.函数功能:对打开的文件描述符fd执行操作。该操作由cmd决定。
项目 | 说明 |
---|---|
函数原型 | int fcntl(int fd, int cmd, ... /* arg */ ); |
头文件 | unistd.h、fcntl.h |
参数说明 | fd:文件描述符 |
cmd:命令选项 | |
... :可选参数 | |
返回值 | 成功返回0, 失败返回非零 |
注意 |
2.cmd选项:
flags | 功能 |
---|---|
F_DUPFD | 复制文件描述符fd |
F_GETFD | 将fd文件描述符作为函数值返回 |
F_SETFD | 对fd设置文件描述符标志 |
F_GETFL | 对应fd文件状态标志作为函数值返回 |
F_SETFL | 将文件状态标志设置为第三个参数值 |
F_GETOWN | 取当前接收SIGIO和SIGURG信号的进程ID或进程组ID |
F_SETOWN | 设置接收SIGIO和SIGURG信号的进程ID或进程组ID |
ioctl()——控制装置
1.函数功能:操作特殊文件的底层设备参数。特别是,字符特殊文件(例如,终端)的许多操作特征可以用ioctl()请求来控制。
项目 | 说明 |
---|---|
函数原型 | int ioctl(int fd, unsigned long request, ...); |
头文件 | sys/ioctl.h |
参数说明 | fd:文件描述符 |
request:依赖于设备的请求代码 | |
...:可选参数 (通常为指针) | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
stat()、fstat()、lstat()——获取文件状态
1.函数功能:
函数 | 函数原型与功能描述 | 参数说明 | 头文件 | 返回值 | 注意 |
---|---|---|---|---|---|
stat() | int stat(const char *pathname, struct stat *statbuf); 返回pathname命名文件有关的信息结构 | pathname:路径名 statbuf:结构体指针 fd:文件描述符 : | sys/types.h、sys/stat.h、unistd.h | 成功返回0,失败返回-1,并设置errno。 | |
fstat() | int fstat(int fd, struct stat *statbuf); 返回fd文件相关信息 | ||||
lstat() | int lstat(const char *pathname, struct stat *statbuf); 与stat()类似,返回符号链接相关信息 |
2.stat结构体:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
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; /* Block size 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
};
access()——检查文件权限
1.函数功能:检查用户对文件的权限
项目 | 说明 |
---|---|
函数原型 | int access(const char *pathname, int mode); |
头文件 | unistd.h |
参数说明 | pathname:文件路径 |
mode:模式选项 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
2.mode常量:
mode | 说明 |
---|---|
R_OK | 测试读权限 |
W_OK | 测试写权限 |
X_OK | 测试执行权限 |
F_OK | 测试文件是否存在 |
umask()——设置文件模式创建掩码
1.函数功能:调用进程的文件模式创建掩码(Umask)设置为mask & 0777(即,只使用掩码的文件权限位)
项目 | 说明 |
---|---|
函数原型 | mode_t umask(mode_t mask); |
头文件 | sys/types.h、sys/stat.h |
参数说明 | mask:掩码常量 |
返回值 | 返回之前的掩码值 |
注意 |
chmod()、fchmod()——改变文件权限
1.函数功能:chmod()
在指定文件上进行操作,fchmod()
对已打开文件进行操作。
项目 | 说明 |
---|---|
函数原型 | int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); |
头文件 | sys/stat.h |
参数说明 | pathname:文件路径名 |
fd:文件描述符 | |
mode:模式 | |
返回值 | 成功返回0, |
chown()、 fchown()、lchown()——更改文件的所有权
1.函数功能:
chown()
改变路径名指定的文件的所有权,如果是符号链接则解除引用。
fchown()
改变被打开的文件描述符fd引用的文件的所有权。
lchown()
类似于chown()
,但不解除对符号链接的引用。
项目 | 说明 |
---|---|
函数原型 | int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *pathname, uid_t owner, gid_t group); |
头文件 | unistd.h |
参数说明 | pathname:文件路径名 |
fd:文件描述符 | |
owner: | |
group: | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
truncate()、ftruncate() —— 将文件截断为指定的长度
1.函数功能:由path命名或fd引用的常规文件被截断为精确长度字节的大小。
如果先前的文件大于这个大小,那么额外的数据就会丢失。如果先前的文件较短,则对其进行扩展,扩展的部分读取为空字节(‘\0’)。
项目 | 说明 |
---|---|
函数原型 | int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length); |
头文件 | unistd.h、sys/types.h |
参数说明 | path:文件路径名 |
fd:文件描述符 | |
length:长度 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
link() ——为文件创建一个新名称(硬链接)
1.函数功能:创建一个到现有文件的新链接(也称为硬链接)。如果newpath
存在,它将不会被覆盖。
项目 | 说明 |
---|---|
函数原型 | int link(const char *oldpath, const char *newpath); |
头文件 | unistd.h |
参数说明 | oldpath:旧文件路径名 |
newpath:新文件路径名 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
unlink() —— 删除一个名称,可能还包括它引用的文件
1.函数功能:从文件系统中删除一个名称。如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可以重用。
项目 | 说明 |
---|---|
函数原型 | int unlink(const char *pathname); |
头文件 | unistd.h |
参数说明 | pathname:文件路径名 |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
remove() —— 删除一个文件或目录【man 3 remove】
1.函数功能:【库函数调用】从文件系统中删除一个名称。对文件=unlink(2)
,对目录调用=rmdir(2)
。
项目 | 说明 |
---|---|
函数原型 | int remove(const char *pathname); |
头文件 | stdio.h |
参数说明 | pathname:文件路径名 |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
rename()——更改文件的名称或位置
1.函数功能:重命名一个文件,如果需要的话可以在不同的目录之间移动它。
项目 | 说明 |
---|---|
函数原型 | int rename(const char *oldpath, const char *newpath); |
头文件 | stdio.h |
参数说明 | oldpath:旧文件路径名 |
newpath:新文件路径名 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
symlink() —— 为文件创建一个新名称(软链接)
1.函数功能:为target
创建一个名为linkpath
的符号链接,其中包含字符串目标。
项目 | 说明 |
---|---|
函数原型 | int symlink(const char *target, const char *linkpath); |
头文件 | unistd.h |
参数说明 | target:旧文件路径名 |
linkpath:新文件路径名 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
readlink() —— 读取符号链接的内容
1.函数功能:将符号链接路径名的内容放在缓冲区buf
中,缓冲区的大小为bufsiz
。readlink()
不会向buf
追加空字节。如果缓冲区太小无法容纳所有的内容,它将(静默地)截断内容(以buffsiz
字符的长度)。
项目 | 说明 |
---|---|
函数原型 | ssize_t readlink(const char *pathname, char *buf, size_t bufsiz); |
头文件 | unistd.h |
参数说明 | pathname:文件路径名 |
buf:缓冲区 | |
bufsiz:缓冲区大小 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
utime()——更改文件的最后访问和修改时间
1.函数功能:将filename
指定的inode
的访问和修改时间分别更改为times
的actime
和modtime
字段。若times
为NULL
,则文件的访问和修改次数设置为当前时间。
项目 | 说明 |
---|---|
函数原型 | int utime(const char *filename, const struct utimbuf *times); |
头文件 | sys/types.h、utime.h |
参数说明 | filename:文件名 |
times:结构体指针 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
2.utimbuf结构体:
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
3.每个文件相关的三个时间值:
mkdir() —— 创建一个目录
1.函数功能:尝试创建一个名为pathname
的空目录。(.
与..
目录项是自动创建,文件访问权限由·mode`决定)
项目 | 说明 |
---|---|
函数原型 | int mkdir(const char *pathname, mode_t mode); |
头文件 | sys/stat.h、sys/types.h |
参数说明 | pathname:文件路径名 |
mode:目录的模式 | |
返回值 | 成功返回0, 失败返回-1,并设置errno。 |
注意 |
rmdir() —— 删除一个目录
1.函数功能:删除目录,该目录必须为空。
项目 | 说明 |
---|---|
函数原型 | int rmdir(const char *pathname); |
头文件 | |
参数说明 | pathname:文件目录名 |
返回值 | 成功返回0, 失败返回-1,并设置errno |
注意 |
opendir()、readdir()、rewinddir()、closedir()、telldir()、seekdir()【man 3 】
1.函数功能:
函数 | 函数原型与功能描述 | 参数说明 | 头文件 | 返回值 | 注意 |
---|---|---|---|---|---|
opendir() | DIR *opendir(const char *name); 打开与目录名对应的目录流,并返回指向目录流的指针。流定位在目录中的第一个条目上 | name:目录名 dirp:目录流结构体指针 loc:调用telldir(3)时返回的值。 | sys/types.h dirent.h | 看数据类型 成功返回指向目录流的指针,失败返回NULL,并设置errno。 成功返回0,失败返回-1,并设置errno 成功返回目录流中的当前位置,失败返回-1 | |
readdir() | struct dirent *readdir(DIR *dirp); 返回一个指向不同结构的指针,该结构表示dirp所指向的目录流中的下一个目录项。它在到达目录流末尾或发生错误时返回NULL。 | ||||
rewinddir() | void rewinddir(DIR *dirp); 将目录流dirp的位置重置为目录的开头。 | ||||
closedir() | int closedir(DIR *dirp); 关闭与dirp关联的目录流。 | ||||
telldir() | long telldir(DIR *dirp); 返回与目录流dirp关联的当前位置。 | ||||
seekdir() | void seekdir(DIR *dirp, long loc); 设置下一个readdir(2)调用在目录流中的起始位置。 |
2.dirent结构体:
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
chdir()、fchdir()——改变工作目录
1.函数功能:将调用进程的当前工作目录更改为path中指定的目录。
fchdir()
与chdir()
相同;唯一的区别是这个目录是作为一个打开的文件描述符给出的。
项目 | 说明 |
---|---|
函数原型 | int chdir(const char *path); int fchdir(int fd); |
头文件 | unistd.h |
参数说明 | path:文件名 |
fd:文件描述符 | |
返回值 | 成功返回0, 失败返回-1,并设置errno |
注意 |
getcwd() —— 获取当前工作目录
1.函数功能:当前工作目录的绝对路径名复制到buf
所指向的数组中,该数组的长度大小为size
。
项目 | 说明 |
---|---|
函数原型 | char *getcwd(char *buf, size_t size); |
头文件 | unistd.h |
参数说明 | buf:空间 |
size:大小 | |
返回值 | 成功返回一个以空字符结束的字符串,该字符串包含一个绝对路径名,即调用进程的当前工作目录。 失败时,这些函数返回NULL,并设置errno来指示错误。错误时,buf所指向的数组的内容未定义。 |
注意 |