linux高级学习2

一.文件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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值