IO进程线程(二)文件IO(系统调用)

一、文件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个字节
相关推荐
CS创新实验室1 小时前
计算机考研408【操作系统】核心知识点总结
java·linux·考研·计算机·操作系统·408
luojiezong1 小时前
锐捷极简以太彩光网络解决方案入选《“AI中国”生态范式案例集(2025)》
网络·人工智能
bulucc1 小时前
vim 快捷操作
linux·编辑器·vim
萧技电创EIIA1 小时前
威纶通触摸屏入门指南(从安装到入门使用)
运维·服务器·网络
我是koten1 小时前
用Ansible查找文件并记录文件名的playbook
linux·运维·centos·ssh·ansible·find·playbook
wanhengidc1 小时前
在线服务器的应用场景都有哪些?
运维·服务器·科技·游戏·智能手机·云计算
rgb2gray1 小时前
城市韧性与交通基础设施系统耦合协调度的时空演变及影响因素
网络·人工智能·python·ai·写作·耦合·耦合协调
炼丹精神小伙1 小时前
ssh通过多跳板机连服务器
运维·服务器·ssh
测试人社区—小叶子2 小时前
测试开发面试高频“灵魂八问”深度解析与应答策略
网络·人工智能·测试工具·云原生·容器·面试·职场和发展
科技块儿2 小时前
【方法】IP66.net:如何查到自己的IP?
网络·网络协议·tcp/ip