2-2linux系统IO

ops/2025/3/1 19:08:14/

文章目录

  • linux系统文件io
    • 1 open /close
      • 1.1 open
      • 1.2 close
      • 1.3 示例
        • 1.3.1 打开已经存在的文件
    • 2 read/write
      • 2.1 read
      • 2.2 write
      • 使用
    • 遗留问题:新创建的文件权限很奇怪
    • 3 lseek
      • 3.1 文件指针的移动
      • 3.2 文件拓展
    • perror函数

linuxio_1">linux系统文件io

系统函数是系统专有的函数,不是内核函数,内核函数是不允许用户使用的,所以系统函数来做这个桥梁调用它

1 open /close

1.1 open

这里纠结了很久,想直接去看c++的文件io,但是没有必要,文件操作的open/close用c标准就行了,所以回过头来看了

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h># 打开已经存在的文件
int open(const char* pathname, int flags);
# 打开文件,如果不存在会自动创建
int open(const char* pathname, int flags, mode_t mode)
  • pathname:文件名

  • flags:使用什么方式打开

    • O_RDONLY
    • O_WRONLY
    • O_RDWR
      • O_APPEND:数据追加到尾部
      • O_CREAT:如果文件不存在就创建文件
      • O_EXCL:检查文件是否存在,必须和O_CREAT一起使用 O_CREAT|O_EXCL
        • 文件不存在,创建文件
        • 文件存在,创建失败,返回-1(如果不使用这个的话不会返回-1)
  • mode:在创建文件的时候指定权限,八进制整数,最大值为0777

    • 还需要计算
  • 返回值,打开成功返回文件描述符 打开失败返回-1

1.2 close

#include <unistd.h>
int close(int fd);
# fd就是open函数的返回值

1.3 示例

1.3.1 打开已经存在的文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <unistd.h>
int main()
{int fd = open("./new.txt",O_WRONLY);if (fd == -1){perror("open:");}else{std::cout << "fd :" << fd;}close(fd);return 0;
}

1.3.2 创建不存在的文件并打开

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <unistd.h>
int main()
{int fd = open("./add.txt",O_RDWR|O_CREAT|O_EXCL);if (fd == -1){perror("open:");std::cout << "file is exists." << std::endl;}else{std::cout << "fd :" << fd << std::endl;}close(fd);return 0;
}

假设在创建新文件的时候, 给 open 指定第三个参数指定新文件的操作权限, 文件也是会被创建出来的, 只不过新的文件的权限可能会有点奇怪, 这个权限会随机分配而且还会出现一些特殊的权限位, 如下:

$ $ ll new.txt 
-r-x--s--T 1 robin robin 0 Jan 30 16:17 new.txt*   # T 就是一个特殊权限

2 read/write

2.1 read

用于读取文件内部数据

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
  • buf 传出参数,只想一块有效内存

  • count buf指向的内存的大小,能存储的最大字节数

  • 返回值

  • 大于零:从文件中读取到的字节数

  • 等于零:读取成功,但啥也没有

  • -1 :读取失败

2.2 write

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

使用

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main()
{int fd = open("./new.txt",O_RDWR);if (fd == -1){perror("open:");}else{std::cout << "fd :" << fd << std::endl;}int fd2 = open("./new2.txt",O_WRONLY|O_EXCL|O_CREAT, 0777);if (fd2 == -1){perror("open:");}else{std::cout << "fd2 :" << fd << std::endl;}char buf[1024];int len = -1;while ( (len = read(fd, buf, sizeof(buf))) > 0){int ret = write(fd2, buf, len);if (ret == -1){perror("write");}}close(fd);close(fd2);return 0;
}

遗留问题:新创建的文件权限很奇怪

如果创建新的文件,要添加mode参数,并指定权限

3 lseek

lseek函数是系统函数,可以移动文件指针,进行文件拓展

#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);- offset 偏移量- whence 指定函数实现什么功能- SEEK_SET:从头部开始偏移offset个字节- SEEK_CUR:从当前文件指针的位置向后偏移offset- SEEK_END:从文件尾部向后偏移offset返回值:- 成功:返回从头部开始计算总的偏移量- 失败: -1

3.1 文件指针的移动

# 指针移动到文件头部
lseek(fd, 0, SEEK_SET);# 查看当前指针的位置
lseek(fd, 0, SEEK_CUR);# 得到文件的大小
lseek(fd, 0, SEEK_END);

3.2 文件拓展

拓展文件以后需要立即写入随便什么东西

	lseek(fd, 1000, SEEK_END);write(fd,"1", 1);

perror函数

#include <stdio.h>
void perror(const char *s)

实际使用的时候,当出现错误的时候会有对应的返回值,我们只知道返回值,至于它的错误是什么,可以调用perror自动输出,还可以添加提示信息s

if (flag == -1)
{perror("error1");close();
}
if (flag == "ss")
{perror("error2");break;
}

总之就是将函数报错的返回值翻译成错误并打印出来


http://www.ppmy.cn/ops/162309.html

相关文章

C/C++ | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…

《A++ 敏捷开发》- 17 持续集成

为了避免客户验收前或使用后才暴露大量棘手缺陷&#xff0c;可能要花很长时间才能发现并解决&#xff0c;便应依据精益和系统工程的原则&#xff0c;把系统拆分成子系统/模块&#xff0c;先开发并测试子系统/模块、集成、再测试&#xff0c;按部就班地完成整个软件开发。 验收…

学术ppt模板_院士增选_自然科学奖_技术发明奖_科技进步奖_杰青_长江学者特聘教授_校企联聘长江学者_重点研发_优青_青长_青拔ppt制作案例

WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 院士增选_自然科学奖_技术发明奖_科技进步奖 PPTX源件&#xff1a;wordinppt.com/slide.html 杰出青年基金答辩PPT模板 2025简约Nature蓝色国家杰青答辩PPT模板 杰出青年基金PPT模板信息 格 式 &#x…

【六祎 - Note】Redis缓存设计模型,备忘录;

Redis缓存备忘录 from to : 点击访问源地址

基于Milvus 向量数据库和Sentence Transformer构建智能问答系统

基于Milvus 向量数据库和Sentence Transformer构建智能问答系统 在当今信息爆炸的时代,智能问答系统成为了提高信息获取效率的重要工具。本文将详细介绍如何使用Python结合Milvus向量数据库和Sentence Transformer模型来构建一个智能问答系统。我们将逐步解析代码,探讨背后的…

浅谈大模型在机器人的实际应用场景

以下均为个人观点&#xff0c;仅供参考&#xff0c;如有雷同&#xff0c;纯属巧合。 大模型在机器人领域的应用正从实验室快速走向产业落地&#xff0c;其通过自然语言理解、多模态感知、任务规划等能力的突破&#xff0c;显著提升了机器人的智能化水平和应用场景的广度。以下是…

3D格式转换工具HOOPS Exchange在PMI处理中的关键作用与优势解析

在现代制造业的数字化进程中&#xff0c;产品和制造信息&#xff08;PMI&#xff09;扮演着至关重要的角色。PMI是指在CAD模型中所包含的用于明确制造和装配细节的各类注释与标记信息&#xff0c;涵盖了几何尺寸、公差、材料说明以及加工要求等关键要素。其能否实现有效传递&am…

基于 Buck-Boost 变换器的磷酸铁锂电池串联电压均衡模糊控制优化策略

针对磷酸铁锂电池串联应用中&#xff0c;由于单体电池之间存在不一致&#xff0c;从而导致蓄电池组利 用率和使用寿命降低的问题&#xff0c;本文提出一种基于非能耗型电压均衡方式的复合式电路拓扑。该均 衡电路在传统单体电池均衡电路的基础上&#xff0c;加入电池组间均衡电…