Linux C文件IO操作

2023-10-30

文件IO


在Linux中万物都为文件,普通文件,设备,socket,标准输入输出等等

常用接口:


Method Parameters Descriptions Return H
open (char* name,int flags,[mode]) 打开文件,通过不同的flags有不同的效果 int(文件描述符) fcntl.h
read (int fd, void * buf, size_t len) 通过文件描述符,读取内容到buf中 ssize_t(写入buf字节数),0代表 EOF, -1代表 ERROR unistd.h
write (int fd, void * buf, size_t len) 无法保证调用后立马存在于文件中(写缓存) ssize_t(写入buf字节数), -1代表 ERROR unistd.h
fsync (int fd) 直接IO,至少两个IO,性能消耗高 成功0,失败-1 unisd.h
fdatasync (int fd) 直接IO,不更新元数据 成功0,失败-1 unisd.h
sync void 对磁盘上的所有缓冲区进行同步 void


参数解析:

  1. open
1. 常用flags
	O_APPEND,文件以追加模式打开,每次写操作之前都会指向文件末尾
	O_ASYNC,当文件可读或可写时,会生成信号默认为SIGIO,不适用普通文件
	O_CLOEXEC,执行新进程会关闭文件,可以避免竞争,和调用fctnl()设置标志位效果一直
	O_CREAT,文件不存在时新建文件
	O_DIRECT,直接用与IO
	O_EXCL,只能和O_CREAT一起使用,文件已经存在时调用失败,可以避免创建竞争
	O_LARGEFILE,可以支持2G以上大文件
	O_NOATIME,不打开修改记录时间戳,避免大量IO
	O_NONBLOCK,文件以非阻塞模式打开,只适合FIFO
	O_TRUNC,普通文件长度截为0
2. MODE,只有新建文件的时候有用,分配文件权限
	直接写数字
	S_IRUSR,文件所有者可读
	......
  1. read
read的返回值情况多种多样
0 EOF:
	1.在阻塞模式下(socket)表示没有数据可读,等待新的数据
	2.在普通文件中,代表到了文件结尾
-1 error:
	1.error == EINTR,取任何字节之前接收到信号,可以重新调用
	2.error == EAGAIN , 这表示由于当前没有数据可用,读操作会阻塞,请求应该稍后再重新执行。这种情况只在非阻塞模式下发生。
	3.error == 其他 ,一些其他严重的错误
len :
	1.与预期一样
小于len :
	1.读取中出错
	2.读取中中断
	3.数据长度小于len

2.1 读入所有字节代码

ssize_t ret; //ssize_t 为有符号的size_t ,在32系统相当于int 和 unsigned int
if (len > SSIZE_MAX)
    len = SSIZE_MAX; //当len大于SSIZE_MAX,read的行为没有定义
while(len != 0 && (ret = read(fd,buf,len)) != 0){
    if (ret == -1){
        if (errno == EINTR) //防止部分读
            continue;
        perror("read");
        break;
    }
    len -= ret;
    buf += ret;
}
  1. write

普通文件预防部分写方法

unsigned Long word =1720;
size_t count;
ssize_t nr;
count = sizeof (word);
nr = write (fd,&word,count);
if(nr==-1)
	/*error,check errno*/
else if (nr != count)
    /* possible error,but 'errno' not set */

socket预防部分写方法

ssize_t ret; //ssize_t 为有符号的size_t ,在32系统相当于int 和 unsigned int
if (len > SSIZE_MAX)
    len = SSIZE_MAX; //当len大于SSIZE_MAX,read的行为没有定义
while(len != 0 && (ret = write(fd,buf,len)) != 0){
    if (ret == -1){
        if (errno == EINTR) //防止部分读
            continue;
        perror("write");
        break;
    }
    len -= ret;
    buf += ret;
}
Refernece

还在更新中~~~
《Linux应用编程第二版》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C文件IO操作 的相关文章

  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • PHP mail() 函数不发送邮件

    我有一个小问题 我正在使用一个工作脚本 在我的测试帐户 共享服务器上工作 使用 mail 函数通过 PHP 发送邮件 我刚刚得到了一个专用服务器 但我还无法让该功能发挥作用 在过去的 10 个小时左右的时间里 我阅读了有关 BIND 用于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • 【云计算】docker前世今生

    下一代云计算模式 Docker正掀起个性化商业革命 作者 吴宁川 来源 ITValue 发布时间 2015 09 20 10 41 阅读 12976 次 推荐 24 原文链接 收藏 文 ITValue 记者吴宁川 从 2008 年开始进入公
  • 推荐4个很棒的Java项目,超级适合小白练手,赶紧收藏!

    好程序员今天给大家推荐4个很棒的Java练手项目 超适合小白哦 网上订餐管理系统 经过对订餐软件的研究 使用 切身体会用户的需求再对商家展开一系列调查 确定商家的需求 基于这些调查结果 设计系统功能 订餐者必须是在线注册了的用户 创立用户
  • 关于cookie的设置path路径的问题

    正常的Cookie只能在一个应用中访问 即cookie只能由创建他的应用访问要实现跨应用访问cookie或者跨域访问cookie就得使用到cookie的setPath 和setDomain 方法 1 同一服务器内的cookie共享方法 se
  • Android实用笔记——使用ViewPager实现导航

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 ViewPager功能 可以使试图左右滑动 类似微信的顶部导航栏 2 加入ViewPager
  • Centos7 ping不通baidu.com《亲测有效》,折磨两天

    问题重现 root bogon ping www baidu com ping www baidu com 未知的名称或服务 在配置Centos7为静态IP时 发现配置什么的都对 但是就是ping不同外网和其它节点 在公司里埋头苦干2天也没
  • R语言:summary()函数解读

    summary 获取描述性统计量 可以提供最小值 最大值 四分位数和数值型变量的均值 以及因子向量和逻辑型向量的频数统计等 结果解读如下 1 调用 Call 2 残差统计量 Residuals 3 系数 Coefficients 4 Mul
  • how to get api via playwright in method page.waitForResponse

    Agenda 1 In this section we will introduce how to use playwright to send api 2 introduce how to convert APIReponse to JS
  • 我在偷偷学Python的第二十七天(正则表达式----下)

    正则表达式介绍 re RegexObject re compile 返回 RegexObject 对象 re MatchObject group 返回被 RE 匹配的字符串 start 返回匹配开始的位置 end 返回匹配结束的位置 spa
  • 搞定VS中反复弹出 Enterprise Core Objects 注册的问题

    搞定VS中反复弹出 Enterprise Core Objects 注册的问题 参照 http blog vichamp com 2007 11 vs2008eco html http capableobjects com node 69
  • OKR概述

    OKR很难吗 用一张图告诉你OKR的定义 操作方法 谷歌实操步骤等 让你快速对OKR有一个全面了解 什么是OKR 中文是目标与关键结果法 是Object ives and Key Results的英文缩写 定义 这是一种由公司 团队和个人协
  • 解决微信自定义图文分享不成功

    首先用到微信开放平台的JS SDK 准备工作 1 用来绑定的微信公众号必须是已认证的 2 链接地址必须是域名 并且是备案过的 当然就得需要服务器了 配置工作 1 配置分享的JS接口安全域名 不然前端配分享时会报错 config invali
  • C++将OpenCV的Mat数据保存为本地.xyz格式,并重新读取为Mat格式

    一 问题 需要将一个OpenCV的Mat格式数据保存到本地为 xyz文件 可用记事本打开 其数据类型为64FC1 数据中包含NaN值 此外还需要将其重新读取为Mat 要求NaN值可以准确识别 二 代码 include
  • Java实现多附件的邮件发送

    叙 本文主要记述了 Springboot 中如何集成并实现多附件的邮件发送 以QQ邮箱的服务器为发送邮件的邮件服务器 Java实现多附件的邮件发送 1 前期准备 1 1 获取收发服务器地址及其端口号 1 2 授权码的获取 2 代码 2 1
  • QTCreator在Ubuntu安装及运行程序报错解决

    1 QT Creator安装 软件包下载 可以进入官网下载或者使用wget命令下载 个人使用wget命令安装如下 sudo wget http download qt io archive qt 5 12 5 12 9 qt opensou
  • VScode修改行间距

    在我们编码的过程中 由于显示字体和显示器的不同 会需要调整行间距 在vscode默认的选项中没有看到设定行间距的选项 不过 可以手动修改配置档达到目的 1 打开设置 2 打开配置档 手动进行设定 3 在选项中添加 editor lineHe
  • Kafka中Producer源码解读

    Producer源码解读 在 Kafka 中 我们把产生消息的一方称为 Producer 即 生产者 它是 Kafka 的核心组件之一 也是消息的来源所在 它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某
  • Qt极简贪吃蛇实现

    持续修正更新该项目 环境 Qt 4 8 Qt5环境也可使用 全部文件传送门 部分重要模块代码 include snakegame h include ui snakegame h SnakeGame SnakeGame QWidget pa
  • 连接SQL Server 数据库

    目录 一 启动 SQL Server Management Studio 1 点击 SQL Server Management Studio 菜单进入 2 选择服务器和身份验证方式 3 点击连接进入数据库 二 新建数据库 1 数据库的概念
  • 6370小时时,在公司稳定兼职(4000/月)(2016年5月2日 PS:实际上并不是稳定兼职,没项目了就没钱了。)

    周六时 兼职的公司要去了我的工行卡号 以后每月打4000到我的卡里 我需要调整规划了 2016年5月2日 PS 实际上并不是稳定兼职 没项目了就没钱了
  • Linux C文件IO操作

    文件IO 在Linux中万物都为文件 普通文件 设备 socket 标准输入输出等等 常用接口 Method Parameters Descriptions Return H open char name int flags mode 打开