linux--关于linux文件IO(2) open、read、lseek、stat

open

在linux中的读写文件有对应的命令。在终端中输入man 2 open可以打开open的手册页,注意man 2是linux自己的函数的一些手册,man 3是C库的手册

打开手册页之后找到open函数的用法如下:

bash 复制代码
#以下是需要的库文件,man 2 open打开直接复制
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#这个是打开文件的用法,返回文件描述符,所以是int类型
int open(const char *pathname, int flags);
	参数:
	- pathname : 要打开的文件路径
	- flags : 对文件的操作权限和其他的设置
		-必选项:O_RDONLY,  O_WRONLY,  or  O_RDWR
		-可选项:O_CREAT 文件不存在创建新文件 等等等...很多,去man 2 open里看。

int open(const char *pathname, int flags, mode_t mode);
	参数:
	- pathname : 要打开的文件路径
	- flags : 对文件的操作权限和其他的设置
		-必选项:O_RDONLY,  O_WRONLY,  or  O_RDWR
		-可选项:O_CREAT 文件不存在创建新文件 等等等...很多,去man 2 open里看。
		-mode : 八进制的数,表示创建出的新的文件的操作权限
		最终的权限是:mode & ~umask (这里是掩码取反, 然后和设置的mode按位与)
		0777 -> 111111111
	&	0775 -> 111111101
	-----------------------
				111111101
		会少一些权限,umask的作用就是抹去某些权限,普通用户coder是(0)022

mode这里为什么是8进制数?

因为在linux中权限要么就是rwx,就是读写可执行的权限,那么这三个权限如果都有就是111,二进制来说就是7。那么一个文件不仅只在一个地方有权限,还有用户对他的权限、其他文件对他的权限等这样的权限使用的地方,有三个这样的地方,那么如果三个地方全都有权限就是0777,0代表八进制数,777代表都有权限,

可以看到gcc编译之后,得到的txt文件权限是0775(5是因为最后是r-x)

read和write

同样man 2 read打开得到read函数的手册,

bash 复制代码
#需要的头文件
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
	参数:
		- fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
		- buf:需要读取数据存放的地方,数组的地址(传出参数)
		- count:指定de数组的大小,读多少
	返回值:
		-成功:
			>0:返回实际已经读取的字节数
			=0:文件已经读取完了
		-失败:-1,并且设置errno	


ssize_t write(int fd, const void *buf, size_t count);
	参数:
		-fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
		-buf:要往磁盘写入的数据,数组
		-count:要写的数据的实际大小,写多少
	返回值:
		成功:实际写入的字节数
		失败:-1,并设置erro

lseek

与C库的fseek是一样的用法。man 2 lseek看命令手册

bash 复制代码
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
	参数:
		-fd:文件描述符
		-offset: 偏移量 off_t就类似于long型
		-whence:
			SEEK_SET:直接指定文件指针到当前设置的offset位置处
	       	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   这个功能就是先提前占用磁盘大小,例如下载一个软件
 		lseek(fd,100,SEEK_END);   //需要写一次数据才管用write(fd, " ", 1);

stat

powershell 复制代码
#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

stat和lstat的区别就是,当有软链接时,stat会返回链接的那个的文件的信息,而lstat会返回软的那个问价你的信息。

一个文件包含着这么一些信息:

那么statbuf这个结构体是这样的变量:就是去获取他们的,创建的时候就struct stat statbuf

stat的获取信息的方式

相关推荐
Christal_pyy3 小时前
树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络
linux·网络·debian
csbDD5 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
小金的学习笔记5 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
EasyNVR6 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
风口上的猪20157 小时前
thingboard告警信息格式美化
java·服务器·前端
Natsuagin7 小时前
轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
linux·windows·ubuntu·grub
我们的五年7 小时前
【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
linux·网络·http
xing.yu.CTF8 小时前
Web入侵实战分析-常见web攻击类应急处置实验2
运维·服务器·windows·web安全·apache·php漏洞·phpstudy后门漏洞
小池先生9 小时前
阿里云子账号管理ECS权限配置全指南
服务器·阿里云·云计算
我们的五年9 小时前
【Linux网络】TCP/IP地址的有机结合(有能力VS100%???),IP地址的介绍
linux·运维·网络·tcp/ip