美文网首页
Linux文件IO的操作

Linux文件IO的操作

作者: 锈色的栅栏 | 来源:发表于2024-11-06 08:59 被阅读0次

文件常用操作IO:open close read write


1.打开文件 open

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
//两个参数的open用于 打开已存在的文件
int open(const char*pathname,int flags);
//三个参数的open用于 打开不存在的文件 mode就是文件在磁盘上的权限7
int open(const char*pathname,int flags,mode_t mode);

功能:
    打开文件,如果文件不存在则可以选择创建。
参数:
    pathname:文件的路径及文件名
    flags:打开文件的行为标志,必选项 O_RDONLY, O_WRONLY, O_RDWR
    mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的磁盘权限
返回值:
    成功:成功返回打开的文件描述符
    失败:-1

(1) flags 文件的操作权限

O_RDONLY          以只读的方式打开
O_WRONLY         以只写的方式打开
O_RDWR             以可读、可写的方式打开

O_CREAT             文件不存在则创建文件,使用此选项时需使用mode说明文件的权限
O_EXCL                如果同时指定了O_CREAT,且文件已经存在,则出错
O_TRUNC            如果文件存在,则清空文件内容
O_APPEND          写文件时,数据添加到文件末尾
O_NONBLOCK    对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/O

mode文件在磁盘的用户权限磁盘文件的用户权限分类:所有拥有者权限(u)、同组用户权限(g)、其他用户权限(o)

(2) mode文件在磁盘的用户权限

磁盘文件的用户权限分类:所有拥有者权限(u)、同组用户权限(g)、其他用户权限(o)
任何权限都分为:读(4)、写(2)、执行(1) 这3个数值可以组合

7--->可读可写可执行 6--->可读可写 5--->可读可执行 4--->只读3--->可写可执行 2--->只写 1--->可执行

mode的权限表示0xxx 每一个x都是(4,2,1)的组合
0777 所有者、同组用户、其他用户都是可读可写可执行
0666 所有者、同组用户、其他用户都是可读可写
0651 所有者可读可写 、同组用户可读可执行、其他用户可执行

(3) mode的系统掩码

查看掩码:umask
umask -S:查看各组用户的默认操作权限

文件的最终权限=给定的权限 & ~umask
umask mode:设置掩码,mode为八进制数

2、close关闭文件描述符

#include<unistd.h>
int close(int fd);

功能:
    关闭已打开的文件
参数:
     fd : 文件描述符,open()的返回值
返回值:
     成功:0
     失败: -1, 并设置errno
注意:close工作步骤,先将文件描述符的数量-1,当文件描述符的数量变为0的时候 ,系统回收文件描述符所占的内核空间。

3、向文件写数据write

#include<unistd.h>
ssize_t write(int fd,const void*buf,size_t count);

功能:
    把指定数目的数据写到文件(fd)
参数:
    fd : 文件描述符
    buf : 数据首地址
    count : 写入数据的长度(字节)
返回值:
    成功:实际写入数据的字节个数
    失败: - 1

4、read读取文件数据

#include<unistd.h>
ssize_t read(int fd,void*buf,size_t count);

功能:
    把指定数目的数据读到内存(缓冲区)
参数:
    fd : 文件描述符
    buf : 内存首地址count : 读取的字节个数
返回值:
    成功:实际读取到的字节个数
    读完文件数据返回0
    失败: - 1

5、 文件的阻塞特性

阻塞和非阻塞 针对的是文件描述符 而不是read write函数
文件描述符 默认 为阻塞的。

1、通过open函数 在打开文件的时候 设置文件描述符为非阻塞。

O_NONBLOCK

2、通过fcntl设置文件的阻塞特性

#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd,int cmd, .../*arg*/);

功能:
    改变已打开的文件性质,fcntl针对描述符提供控制。
参数:
    fd:操作的文件描述符
    cmd:操作方式arg:针对cmd的值,fcntl能够接受第三个参数int arg。
返回值:
    成功:返回某个其他值
    失败:-1

fcntl函数有5种功能:
1) 复制一个现有的描述符(cmd=F_DUPFD)
2) 获得/设置文件描述符标记(cmd=FGETFD 或 FSETFD)
3) 获得/设置文件状态标记(cmd=FGETFL 或 FSETFL)
4) 获得/设置异步 I/O 所有权(cmd=FGETOWN 或 FSETOWN)
5) 获得/设置记录锁(cmd=FGETLK, FSETLK 或 F_SETLKW)

6、 获取文件的状态信息

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char*path,struct stat*buf);
int lstat(const char*pathname,struct stat*buf); //不穿透

功能:
    获取文件状态信息
    stat 和 lstat 的区别:
        当文件是一个符号链接时,lstat 返回的是该符号链接本身的信息;
        而 stat 返回的是该链接指向的文件的信息。
参数:
    path:文件名
    buf:保存文件信息的结构体
返回值:
     成功: 0失败: -1

struct 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;    //块大小(文件系统的I/O 缓冲区大小)
        blkcnt_t            st_blocks;    //块数
        time_t               st_atime;    //最后一次访问时间
        time_t               st_mtime;    //最后一次修改时间
        time_t               st_ctime; //最后一次改变时间(指属性)
};

st_mode(16位整数)参数说明 :

7、重新定位读/写文件偏移量lseek

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

功能:
    改变文件的当前位置
参数:
    fd:文件描述符
    offset:文件偏移量
    whence:文件偏移相对位置
    SEEK_SET:将文件指针偏移到传入字节数处(文件头开始偏移)
    SEEK_CUR:将文件指针偏移到当前位置加上传入字节数处;((当前位置开始偏移)
    SEEK_END:将文件指针偏移到文件末尾加上传入字节数处(作为拓展作用,必须再执行一次写操作)
返回值:成功:返回文件新的偏移量(成功)

8、文件目录操作

1、得到文件目录的句柄

#include<sys/types.h>
#include<dirent.h>
DIR*opendir(const char*name);

功能:
    打开一个目录
参数:
    name:目录名
返回值:
    成功:返回指向该目录结构体指针
    失败:NULL

2、读取目录

#include<dirent.h>
struct dirent *readdir(DIR *dirp);

功能:
    读取目录 调用一次只能读取一个文件
参数:
    dirp:opendir的返回值
返回值:
    成功:目录结构体指针
    失败:NULL

struct dirent{
    ino_t  d_ino;         // 此目录进入点的 inode
    off_t d_off;           // 目录文件开头至此目录进入点的位移
    signed short int d_reclen;     // d_name 的长度, 不包含 NULL 字符
    unsigned char d_type;          // d_type 所指的文件类型
    char d_name[256];                // 文件名
};

d_type相关数据:

3、关闭目录

#include<sys/types.h>
#include<dirent.h>
int closedir(DIR *dirp);

功能:
    关闭目录
参数:
    dirp:opendir返回的指针
返回值:
    成功:0
    失败:-1

相关文章

  • 理解epoll多路复用和Reactor设计思想

    1.Linux网络IO模型 在linux系统中所有的外部设备的操作都可以看作是一个文件操作,linux对文件操作的...

  • 2019-06-16 IO文件操作---C语言

    Linux下普通IO文件操作---C语言 普通文件IO总结 FILE结构体 打开文件fopen函数 文件指针名=f...

  • Linux 文件IO 和 标准IO

    [TOC] Linux 文件IO 和 标准IO Linux 文件IO Linux中做文件IO最常用到的5个函数是:...

  • 软件架构设计-操作系统

    操作系统 直接IO与缓冲IO 缓冲io又称作标准I/O,大多数文件系统的默认IO操作都是缓冲IO。在linux的缓...

  • Itop4412学习笔记(2)

    ​ 今天学习的是文件IO的操作,需要记录的点: 1.库函数头文件 ​ 在所有Linux系统中,对文件的操作...

  • Linux编程学习笔记 | Linux IO学习[2] - 标准

    在上一篇Linux编程学习笔记 | Linux IO学习[1] - 文件IO中,我总结了Linux下的文件IO。文...

  • Linux文件操作与IO

    底层文件访问 open系统调用 在遵循POSIX规范的系统上,使用open系统调用并不需要包含头文件sys/typ...

  • 文件 io

    文件操作 io读操作 io写操作 复制文件 断点续传 bufio包 func NewReader(rd io.Re...

  • 浅析 Linux 文件 IO 读写

    浅析 Linux 文件 IO 读写 Linux的文件IO子系统是Linux中最复杂的一个子系统(没有之一)。读者可...

  • linux IO多路复用笔记

    什么是IO io是数据的接收和发送操作,linux进程无法直接操作io设备,需要通过系统调用请求内核来完成io操作...

网友评论

      本文标题:Linux文件IO的操作

      本文链接:https://www.haomeiwen.com/subject/mxlndjtx.html