24.8.10学习目录
一.文件IO(续)
1.文件的阻塞特性
阻塞与非阻塞是对文件描述符而言,而不是指read、write等的特性;且默认为阻塞
在open打开文件时设置非阻塞:
//添加上O_NONBLOCK则就是非阻塞
int fd = open("/dev/tty",O_RDONLY | O_NONBLOCK);
当文件描述符存在时,使用fcntl设置文件的阻塞特性:
#include <unistd.h>
#include <fcntl.h>
//fd为文件描述符,cmd为操作方式,arg为针对cmd的值fcntl能接受第三个参数int arg
int fcntl(int fd,int cmd, ... /* arg */)
fcntl函数的功能:
- 复制一个现有的描述符(cmd为F_DUPFD)
- 获取 / 设置文件描述符标记(cmd为F_GETFD或F_SETFD)
- 获取 / 设置文件状态标记(cmd为F_GETFL或F_SETFL)
- 获取 / 设置异步I/O所有权(cmd为F_GETOWN或F_SETOWN)
设置非阻塞步骤:
//获取文件状态标记
int flag = fcntl(0,F_GETFD);
//修改文件状态标记
flag = flag | O_NONBLOCK;
//设置文件标记,让新的状态标记生效
fcntl(0,F_SETFL,&flag);
2.获取文件的状态信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
//将信息填充到buf结构体中
int stat(const char *path,struct stat *buf);
int lstat(const char *pathname,struct stat *buf);
stat与lstat的区别:
当文件是一个符号连接时,lstat返回的是该符号链接本身的信息;stat返回的是该链接指向的文件的信息。
读取文件中的信息:
struct stat s;
stat("b.txt",&s);
//获取文件的类型,其有定义宏函数
if(S_ISREG(s.st_mode))
{
printf("为普通文件\n");
}
else if(S_ISDIR(s.st_mode))
{
printf("为目录文件\n");
}
//获取文件的权限,其没有定义宏函数,只能用与来判断
if((s.st_mode & S_IRUSR) == S_IRUSR)
{
printf("具有读权限\n");
}
if((s.st_mode & S_IWUSR) == S_IWUSR)
{
printf("具有写权限\n");
}
3.文件目录操作
得到文件目录的句柄
#include <sys/types.h>
#include <dirent.h>
//打开一个目录,返回目录结构体指针
DIR *opendir(const char *name);
读取目录中的文件:
#include <dirent.h>
//一次获取目录中的一个文件,可以将其添加到循环中读取全部文件
struct dirent *readdir(DIR *dirp);
关闭目录:
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);