IO进程线程(三)文件IO之open/close read/write lseek

一、文件IO

(一)概念

文件IO就是系统调用,用户空间进入内核空间的过程就是系统调用。

系统调用没有缓冲机制,效率较低,可移植性也相对较差,实时性高。

文件描述符是使用open函数打开文件时的返回值,一般叫做fd,这个fd就代表这个打开的文件,

以后对文件的读写操作,就是通过这个文件描述符fd来完成的。

fd是一个整数,在一个程序中文件描述符的范围0-1023共计1024个,

使用uilmit -a 可以查看一个程序中可以打开的文件的个数限制

(open files 后面对应的就是 这个值也可以使用命令 ulimit -n 2048来修改 但一般都是用默认值)

在一个程序启动的过程中,默认就会打开三个描述符(0 1 2),

如果再打开新文件,一般是从3开始的

文件描述符 功能

0 标准输入

1 标准输出

2 标准出错

(二)open和close 函数的使用

1. open

c 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
功能:
    使用文件IO的方式打开一个文件
参数:
    pathname:文件的路径和名字
    flags:
        O_RDONLY  只读的方式打开文件
        O_WRONLY   只写的方式打开文件
        O_RDWR    读写的方式打开文件
        ----上面三个必须三选一  下面的是附加选项----
        O_APPEND  以追加的方式打开文件
        O_CREAT  如果文件不存在,则新建这个文件
            如果指定了这个宏,则第三个参数 mode 必须填
            mode代表的是创建文件的权限
            创建普通文件的最大权限为 0666
            也就是说我们给mode赋值 最大应该就为 0666
            但是实际上创建文件的权限还得涉及 掩码 umask
            umask的值 默认为 0002  这个值也可以改的
            最终的权限 = (mode & ~umask)
            所以 即使给的是 0666 最终的权限也是 0664
        O_EXCL 需要和 O_CREAT 一起使用 如果文件不存在会创建文件
                如果文件存在,会报错 错误码:EEXIST
        O_TRUNC :如果文件存在就清空
    mode:代表文件的权限 一般用8进制表示
返回值:
    成功  文件描述符(返回的文件描述符遵循未被打开的最小原则)
    失败  -1 重置错误码

flags操作的原理

标准io 文件io 说明
r O_RDONLY 以只读的方式打开文件
r+ O_RDWR 以读写的方式打开文件
w O_WRONLY|O_CREAT|O_TRUNC, 0666 以只写的方式打开文件文件存在就清空不存在就新建
w+ O_RDWR O_CREAT

2. close 函数的使用

c 复制代码
#include <unistd.h>
int close(int fd);
功能:关闭文件
参数:fd:文件描述符
返回值:
    成功 0
    失败 -1 重置错误码

(三)read/write函数

1. read

c 复制代码
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:
    从文件fd中读取最多count个字节到buf中
参数:
    fd:文件描述符
    buf:用来存放读到的内容的缓冲区的首地址
    count:想要读取的字节数
返回值:
    成功  实际读到的字节数(读到文件结束会返回0)
    失败  -1  重置错误码

2. write

c 复制代码
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:
    把buf指向的内容写最多count个到文件fd中
参数:
    fd:文件描述符
    buf:要写入的内容的首地址
    count:想要写入的字节数
返回值:
    成功  实际写入的字节数
    失败  -1  重置错误码

(四)光标操作

c 复制代码
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
功能:
    设置光标位置
参数:
    fd:文件描述符
    offset:偏移量
        0  不偏移
        >0  向后偏移
        <0  向前偏移
    whence:相对位置
        SEEK_SET  相对于文件开头
        SEEK_CUR  相对于当前位置
        SEEK_END  相对于文件结尾
返回值:
    成功  光标新位置距离文件开头的偏移量
    失败  -1  重置错误码

使用实例:
    lseek(fd, 0, SEEK_SET);//将光标定位到文件开头
    lseek(fd, 0, SEEK_END);//将光标定位到文件结尾
    lseek(fd, 10, SEEK_CUR);//将光标向后偏移10个字节
    lseek(fd, -10, SEEK_CUR);//将光标向前偏移10个字节
    lseek(fd, 10, SEEK_SET);//将光标定位到文件开头第10个字节
    lseek(fd, -10, SEEK_END);//将光标定位到文件倒数第10个字节
相关推荐
程序员南飞37 分钟前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
StrokeAce37 分钟前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
热爱嵌入式的小许5 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
韩楚风8 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学8 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO8 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu79 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我9 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、9 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程9 小时前
Linux中环境变量
linux