linux---基础IO

2023-05-16

在标准库中我们学习了printf,fprintf,sprintf,snprintf等等相关的函数,接下来是我们的系统I/O调用接口
open

       #includ e <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)

此时我们打开一个文件就需要使用open函数,需要包含sys/types.h和sys/stat.h和fcntl.h三个头文件。
参数:

  • pathname:文件名字

  • flags:这里我们把它叫做参数选项

      O_RDONLY:以只读的方式打开
      O_WRONLY:以只写的方式打开
      O_RDWR:以读写的方式打开
      O_CREAT:如果文件不存在就创建一个新的文件
      O_APPEND:向文件末尾追加内容
      O_TRUNC:截断文件,(清空原有的数据)
      ...
    
  • mode:设置文件权限

返回值:

  • 成功:返回0
  • 失败:返回-1

write

       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);

参数列表:

  • fd:open函数打开时返回的文件描述符
  • buf:缓冲区的名字
  • count:缓冲区中字节数的大小(一般使用strlen()计算)

返回值:

  • 成功:返回所写入的字节数(若为零则表示没有写入数据).
  • 错误:时返回-1,并置errno为相应值.
  • 若count为零,对于普通文件无任何影响,但对特殊文件 将产生不可预料的后果
    我们在后面再讨论出现0的情况

read

       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);

read()从文件描述符fd中读取count字节数据并放入从buf开始的缓冲区中,如果count为0,read()返回0,不执行其他任何操作,如果count大于SIZE_MAX,那么结果将不可预料
参数:

  • fd:文件描述符
  • buf:缓冲区名字
  • count:读取的字节数,一般使用缓冲区的大小。

返回值:

  • 成功时返回读取到的字节数(为0表示读到文件描述符)此返回值守文件剩余字节数限制,当返回值小于制定的字节数时并不意味这错误,这可能是因为当前可读取的字节数小于指定的字节数(比如已经接近文件末尾,或者正在从管道或者中断读取数据,或者read()被信号中断)
  • 失败返回-1,并使errno为相应值,在这种情况下无法得知文件偏移位置是否有变化。

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:文件结束的位置
    

返回值:

  • 成功返回文件开始到最后光标位置的字节数的大小
  • 失败返回-1,并设置errno的值

lseek可以用来计算我们文件的大小

例子:

  1 #include <stdio.h>                                                          
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <unistd.h>
  6 #include <string.h>
  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 #include <unistd.h>
  6 #include <string.h>
  7 int main(){
  8 
  9     int fd = open("te.txt",O_RDWR|O_CREAT,664);
 10     if(fd == -1){
 11         perror("open error\n");
 12     }
 13     char buf[1024];
 14     char str[] = "你好啊同学!!!";
 15     int ret = write(fd,str,sizeof(str));
 16     if(ret == -1){
 17         perror("write error");
 18     }
 19     ret = read(fd,buf,sizeof(buf));
 20     if(ret == -1){
 21         perror("read error");
 22     }
 23     printf("读取到的内容%s",buf);
 24     ret = lseek(fd,0,SEEK_END);
 25     if(ret == -1){
 26         perror("lseek erro");
 27     }
 28     printf("文件大小%d",ret);
 29     return 0;
 30 } 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux---基础IO 的相关文章

  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段

随机推荐

  • linux--进程控制2

    在进程控制的章节我们讲解了我们的进程创建 xff0c 这章节对进程控制进行补充 xff0c 进程终止 在我们创建一个进程之后我们避免不了我们去终止我们的进程 终止场景 正常退出 xff0c 结果符合我们的预期正常退出 xff0c 结果不符合
  • VINS-Mono论文学习与代码解读——目录与参考

    前言 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU融合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09 为更好地进行学
  • VINS-Mono代码解读——视觉跟踪 feature_trackers

    前言 本文主要介绍VINS的视觉处理前端的视觉跟踪模块 xff08 feature trackers xff09 论文第四章A节 xff08 IV MEASUREMENT PREPROCESSING A Vision Processing
  • 视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

    前言 本博客主要介绍在SLAM问题中常常出现的一些线性代数相关的知识 xff0c 重点是如何采用矩阵分解的方法 xff0c 求解线性方程组AX 61 B 主要参考了 计算机视觉 算法与应用 附录A以及Eigen库的方法 本博客可能不会对分解
  • pycharm 每次打开文件都要配置解释器的解决方案

    今天在打开pycharm的时候 xff0c 又发现那个解释器不能用了 xff0c 然后在网上找解决方案 xff0c 有的说是用defautsetting解决 xff0c 然是我没有找到那个default setting 在哪里 233333
  • PS多边形套锁工具在框选区的时候一按shift键PS

    微软输入法更新导致的BUG xff0c 把微软拼音输入法设置中兼容性里使用旧版就解决了 步骤 xff1a 右键输入法 xff0c 选择设置 xff0c 选择常规 xff0c 然后拖到最下面 xff0c 勾上兼容性就可以 xff0c 如下图
  • N卡怎么修改录屏文件保存位置

    N卡的视频录制非常好用 xff0c 但是有时候找不到保存位置在哪里 xff0c 这里转载下文章记录下 xff0c 方便后续查看 首先告诉你默认位置 我的电脑下的 34 视频 34 文件夹 xff08 有的电脑里叫video xff09 如果
  • 常见的设计模式

    目录 工厂模式单例模式观察者模式策略模式代理模式装饰模式 工厂模式 这个模式有三个对象 xff1a 工厂 用户 产品 xff1b 这么说可能还有点抽象 xff0c 说具体点 xff0c 就是当我们在代码中需要生成一个类实例时 xff0c 不
  • C# 的静态构造函数和BeforeFieldInit含义

    1 静态初始化函数 xff1a 静态初始化函数 xff0c C 语法可以保证在一个程序中只调用一次 xff0c 但是会去掉默认的beforefieldinit 标记 xff08 C 默认会加 xff09 xff0c 会导致加载时机的变化 x
  • Unity万向锁

    结论 xff1a 当第二轴旋转 90 时会产生万向锁 xff0c 万向锁只发生在程序中 xff0c 现实世界不会发生 发生万向锁的底层原因是由于程序中会指定旋转顺序 xff0c 且前后顺序为父子包含关系 旋转顺序 xff1a 因为同样一组数
  • python脚本与shell脚本的相互调用

    python脚本与shell脚本的相互调用 python脚本调用shell脚本 xff1a 存在的shell脚本 xff08 test sh sh xff09 xff1a span class token comment bin csh s
  • 自动实现一个minishell更新(增加重定向功能)

    增加重定向功能 1 include lt stdio h gt 2 include lt unistd h gt 3 include lt stdlib h gt 4 include lt string h gt 5 include lt
  • linux sh 运行csh类型脚本报错

    初入linux xff0c 脚本用的是csh版本 xff0c 在尝试的过程中 xff0c 突然发现按照csh的语法写的指令 xff0c 运行不了 xff0c 例如 1 sh xff1a span class token function s
  • QT creator导入现有工程

    QT creator导入现有工程 如果从gitlib或者其他代码库下载了一些源文件 xff0c 用QT creator打开步骤如下 xff1a 点击 菜单栏的 File gt New File or Project点击 Import Pro
  • 腾讯测试开发面试题

    唉 xff0c 今天面试腾讯的测试开发工程师 xff0c 脸被打肿了 xff0c 下来查阅资料 xff0c 把一道面试题讲一讲吧 xff0c 题目是 xff1a O N 求一个数字串能整除3的连续子串的个数 xff0c 前缀和数组 43 对
  • bat命令调用rar进行文件夹压缩

    64 echo off set 34 ymd 61 date 0 4 date 5 2 date 8 2 date 11 2 date 14 2 34 rem ymd 就是当前的时间 例如20181022 34 C Program File
  • vbs执行相应的bat文件

    set ws 61 createobject 34 wscript shell 34 rem 新建一个脚本对象 do rem do loop 执行循环 ws run 34 C Users Administrator Desktop rar
  • 思岚科技RPlidar A3激光雷达ROS源码详解

    思岚科技RPlidar A3激光雷达ROS源码详解 使用 RPLIDARD 的 SDK 其实重点在于看懂client cpp和node cpp两个sample代码 xff0c 因此在这里我们讲从这里入手学习 RPLIDAR A3 的SDK
  • gcc和makefile用法总结(建议收藏)

    文章目录 64 toc 1 用GCC制作静态链接库静态链接库的创建静态链接库的使用 2 用GCC制作动态链接库动态链接库的创建动态链接库的使用 3 GCC找不到库文件怎么办 xff1f GCC生成可执行文件时找不到库文件GCC运行可执行文件
  • linux---基础IO

    在标准库中我们学习了printf xff0c fprintf xff0c sprintf xff0c snprintf等等相关的函数 xff0c 接下来是我们的系统I O调用接口 open includ e lt sys types h g