文件描述符
PCB进程控制块可以说是一个复杂的结构体
文件描述符表就是一个数组
在linux系统中,进程是通过文件描述符(file descriptors 简称fd)来访问文件的,文件描述符实际上是一个整数。
一个应用程序,打开一个文件a打开一个文件b等等,你需要一个数组来存储这些文件描述符。每打开一个新文件,则占用一个文件描述符,而且是空闲的最小的一个文件描述符;
大小默认1024;
表中前三个默认是被使用的,:0(标准输入)、1(标准输出)、2(标准错误);默认是打开状态,对应文件是当前终端。
不是说文件描述符表里都是指向文件吗,在linux中一切皆文件,这些也是指向设备文件。
open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// 打开一个已经存在的文件
int open(const char *pathname, int flags);
参数:
pathname:要打开的文件路径
flags:对文件的操作权限设置还有其他的设置
O_RDONLY, O_WRONLY, O_RDWR 这三个设置都是互斥的
返回值:返回一个新的文件描述符,如果调用失败,返回-1
errno:属于Linux系统函数库,库里面的一个全局变量,记录的是最近的错误号。
#include <stdio.h>
void perror(const char *s);作用:打印errno对应的错误描述
s参数:用户描述,比如hello,最终输出的内容是hello:xxx(实际的错误描述)
// 创建一个新的文件
int open(const char *pathname, int flags, mode_t mode);
参数:
- pathname:要创建的文件的路径
- flags:对文件的操作权限和其他的设置
- 必选项:O_RDONLY, O_WRONLY, O_RDWR 这三个互斥
- 可选项:O_CREAY 文件不存在,创建新文件
- mode:八进制的数,表示创建出的新的文件的操作权限,比如:0775
最终的权限是:mode & ~umask
0777
read、write
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
-fd: 文件描述符,open得到的,通过这个文件描述符操作某个文件
-buf: 需要读取数据存放的地方,数组的地址(传出参数)
-count: 指定的数组的大小
返回值:
-成功:
>0: 返回实际的读取到的字节数
=0:文件已经读取完了
-失败: -1,并且设置errno
#include <unistd.h>
ssize_t write(int fd,const void *buf, size_t count);
参数:
-fd: 文件描述符,open得到的,通过这个文件描述符操作某个文件
-buf: 要往磁盘写入的数据,数据
-count: 要写的数据的实际的大小
返回值:
成功: 实际写入的字节数
失败: 返回-1,并设置errno
lseek
标准c库的函数
# include <stdio.h>
int fessk(FILE *stream, long offset, int whence);
Linux系统函数
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数:
- fd: 文件描述符,通过open得到的,通过这个fd操作某个文件
- offset: 偏移量
- whence:
SEEK_SET:设置文件指针的偏移量
SEEK_CUR:设置偏移量:当前位置+第二个参数offset的值
SEEK_END:设置偏移量:文件大小+第二个参数offset的值
返回值:返回文件指针的位置
作用:
1.移动文件指针到头文件
lseek(fd, 0, SEEK_SET);
2.获取当前文件指针的位置
lseek(fd, 0, SEEK_CUR);
3.获取文件长度
lseek(fd, 0, SEEK_END);
4.拓展文件的长度,当前文件10b,110b,增加了100个字节
lseek(fd, 100, SEEK_END);
stat
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
作用:获取一个文件相关的一些信息
参数:
- pathname:操作的文件的路径
- statbuf: 结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
int lstat(const char *pathname, struct stat *statbuf);
参数:
- pathname:操作的文件的路径
-statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
属性操作
int access(const char *pathname, int mode); // 判断文件权限及文件是否存在
int chmod(const char *filename, int mode); // 修改文件权限
int chown(const char *path, uid_t owner, gid_t group); // 修改文件所有者
int truncate(const char *path, off_t length); // 缩减或者扩展文件的大小
int access(const char *pathname, int mode);
作用:判断某个文件是否有某个权限,或者文件是否存在
参数:
-pathname:判断的文件路径
-mode:
R_OK:判断是否有读权限
W_OK:判断是否有写权限
X_OK:判断是否有执行权限
F_OK:判断文件是否存在
返回值:成功返回0,失败返回-1
int chmod(const char *filename, int mode);
作用:修改文件权限
参数:
-pathname:需要修改的文件的路径
-mode:需要修改的权限值,八进制的数
返回值:成功返回0,失败返回-1;
目录操作
int mkdir(const char *pathname, mode_t mode); // 创建一个目录
int rmdir(const char *pathname); // 删除一个空文件
int rename(const char *oldpath, const char *newpath);// 对目录进行重命名
int chdir(const char *path); // 更改当前目录
char *getcwd(char *buf,size_t size); // 获取当前路径
// 目录遍历函数
DIR *opendir(const char *name); // 打开一个目录
struct dirent *readdir(DIR *dirp); // 读取目录,读取目录里面的内容
int closedir(DIR *dirp); // 关闭一个目录
dup、dup2
int dup(int oldfd);
// 复制文件描述符
int dup2(int oldfd,int newfd);
// 重定向文件描述符
fcntl
int dup(int oldfd);
// 复制文件描述符
int dup2(int oldfd,int newfd);
// 重定向文件描述符