Linux系统 文件IO相关函数

文章目录

      • 一、IO 函数
        • 1、open 函数
        • 2、read 函数
        • 3、write 函数
        • 4、lseek 函数
        • 5、stat 函数
      • 二、文件属性操作函数
        • 1、access 函数
        • 2、chmod 函数
        • 3、truncate 函数
      • 三、目录操作函数
        • 1、mkdir 函数
        • 2、chdir 函数
      • 四、目录遍历函数
        • 1、opendir 函数
        • 2、readdir 函数
        • 3、closedir 函数
      • 五、文件描述符操作函数
        • 1、dup 函数
        • 2、dup2 函数
        • 3、fcntl函数

一、IO 函数

1、open 函数
  • 头文件
 #include 
 #include 
 #include 
  • 函数描述
// 打开一个已经存在的文件
int open(const char *pathname, int flags);
	参数:
		- pathname:要打开的文件路径
		- flags:对文件的操作权限设置还有其他的设置
			O_RDONLY,  O_WRONLY,  O_RDWR  这三个设置是互斥的
	返回值:返回一个新的文件描述符,如果调用失败,返回-1

errno:属于Linux系统函数库,库里面的一个全局变量,记录的是最近的错误号。

// 创建一个新的文件
int open(const char *pathname, int flags, mode_t mode);
	参数:
	    - pathname:要创建的文件的路径
	    - flags:对文件的操作权限和其他的设置
	        - 必选项:O_RDONLY,  O_WRONLY, O_RDWR  这三个之间是互斥的
	        - 可选项:O_CREAT 文件不存在,创建新文件
	    - mode:八进制的数,表示创建出的新的文件的操作权限,比如:0775
	    最终的权限是:mode & ~umask
	    0777   ->   111111111
	&   0775   ->   111111101
	----------------------------
	                111111101
	按位与:0和任何数都为0
	umask的作用就是抹去某些权限。
	
	flags参数是一个int类型的数据,占4个字节,32位。
	flags 32个位,每一位就是一个标志位。
  • 拓展:perror 函数
#include 
void perror(const char *s);
	作用:打印errno对应的错误描述
	参数:用户描述,比如hello,最终输出的内容是  hello:xxx(实际的错误描述)
2、read 函数
  • 头文件
#include 
  • 函数描述
ssize_t read(int fd, void *buf, size_t count);
	参数:
        - fd:文件描述符,open得到
        - buf:需要读取数据存放的地方,数组地址
        - count:指定数组的大小
    返回值:
        - 成功
            >0:返回读取数据字节数
            =0:文件读取完了
        - 失败:-1,设置errno
3、write 函数
  • 头文件
#include 
  • 函数描述
ssize_t write(int fd, const void *buf, size_t count);
	参数:
        - fd:文件描述符,open得到
        - buf:往磁盘写入的数据
        - count:要写数据的大小
    返回值:
        - 成功:实际写入字节数
        - 失败:-1,设置errno
4、lseek 函数
  • 头文件
#include 
#include 
  • 函数描述
off_t lseek(int fd, off_t offset, int whence);
	参数:
        - fd:文件描述符,open得到
        - 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,增加100个字节
        lseek(fd, 110, SEEK_END);
5、stat 函数
  • stat结构体
struct stat{
	dev_t st_dev; // 文件的设备编号
	ino_t st_ino; // 节点
	mode_t st_mode; // 文件的类型和存取的权限
	nlink_t st_nlink;// 连到该文件的硬连接数目
	uid_t st_uid;// 用户ID
	gid_t st_gid;// 组ID
	dev_t st_rdev;//设备文件的设备编号
	off_t st_size;// 文件字节数(文件大小)
	blksize_t st_blksize;// 块大小
	blkcnt_t st_blocks;// 块数
	time_t st_atime; // 最后一次访问时间
	time_t st_mtime;// 最后一次修改时间
	time_t st_stime; // 最后一次改变时间(指属性)
};
  • 头文件
#include 
#include 
#include 
  • 函数描述
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

二、文件属性操作函数

1、access 函数
  • 头文件
#include 
  • 函数描述
int access(const char *pathname, int mode);
	作用:判断某个文件是否某个权限,或者是否存在
	参数:
	    - pathname:判断文件路径
	    - mode:
	        R_OK: 判断是否有读权限
	        W_OK: 判断是否有写权限
	        X_OK: 判断是否有执行权限
	        F_OK: 判断文件是否存在
	返回值:成功返回0,失败返回-1
2、chmod 函数
  • 头文件
#include 
  • 函数描述
int chmod(const char *pathname, mode_t mode);
	作用:修改文件权限
	参数:
	    - pathname:需要修改文件的路径
	    - mode:需要修改的权限,八进制的数
	返回值:成功返回0,失败返回-1
3、truncate 函数
  • 头文件
#include 
#include 
  • 函数描述
int truncate(const char *path, off_t length);
	作用:缩减或扩展文件尺寸至指定大小
	参数:
	    - path:需要修改的文件路径
	    - length:需要最终文件的大小
	返回值:成功返回0,失败返回-1

三、目录操作函数

1、mkdir 函数
  • 头文件
#include 
#include 
  • 函数描述
int mkdir(const char *pathname, mode_t mode);
	作用:创建一个目录
	 参数:
	     -pathname:创建目录的路径
	     -mode:权限,八进制数
	 返回值:
	     成功返回-1,失败返回0
2、chdir 函数
  • 头文件
#include 
  • 函数描述
char *getcwd(char *buf, size_t size);
	作用:获取当前工作路径
int chdir(const char *path);
    作用:修改工作路径

四、目录遍历函数

1、opendir 函数
  • 头文件
#include 
#include 
  • 函数描述
// 打开一个目录
DIR *opendir(const char *name);
	参数:
	    - name: 需要打开的目录的名称
	返回值:
	    DIR * 类型,理解为目录流
	    错误返回NULL
2、readdir 函数
  • 头文件
#include 
  • 函数描述
// 读取目录中的数据
struct dirent *readdir(DIR *dirp);
	- 参数:dirp是opendir返回的结果
	- 返回值:
	    struct dirent,代表读取到的文件的信息
	    读取到了末尾或者失败了,返回NULL
3、closedir 函数
  • 头文件
#include 
#include 
  • 函数描述
// 关闭目录
int closedir(DIR *dirp);

五、文件描述符操作函数

1、dup 函数
  • 头文件
#include 
  • 函数描述
int dup(int oldfd);
	作用:复制一个新的文件描述符
	从空闲文件描述符表中找到一个最小,作为新的拷贝文件描述符
2、dup2 函数
  • 头文件
#include 
  • 函数描述
int dup2(int oldfd, int newfd);
    作用:重定向文件描述符
    - oldfd指向a.txt,newfd指向b.txt
    - 调用函数成功后,b.txt 和 newfd都close, newfd指向a.txt
    - oldfd必须是有效的
3、fcntl函数
  • 头文件
#include 
#include 
  • 函数描述
int fcntl(int fd, int cmd, ...);
	参数:
    	fd:需要操作文件描述符
    	cmd: 表示对文件描述符进行如何操作
	        - F_DUPFD : 复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符(返回值)
	            int ret = fcntl(fd, F_DUPFD);
	
	        - F_GETFL : 获取指定的文件描述符文件状态flag
	            获取的flag和我们通过open函数传递的flag是一个东西。
	
	        - F_SETFL : 设置文件描述符文件状态flag
	            必选项:O_RDONLY, O_WRONLY, O_RDWR 不可以被修改
	            可选性:O_APPEND, O_NONBLOCK
	            O_APPEND 表示追加数据
	            O_NONBLOCK 设置成非阻塞
				阻塞和非阻塞:描述的是函数调用的行为。

你可能感兴趣的:(Linux系统编程,Linux,系统编程,文件IO)