高级I/O函数

2023-11-06

应用层程序能往一个TCP连接中写入多少字节的数据,取决于对方的接收窗口的大小和本端的拥塞窗口的大小。

管道本身有一个容量限制,规定如果应用程序不将数据从管道读走的话,该管道最多能写入多少字节的数据,自Linux 2.6.11内核起,管道容量的大小是65536字节,可以使用fcntl函数来修改管道容量;

管道

#include<unistd.h>
int pipe(int fd[2]); // 默认情况下是阻塞的
  • read系统调用读取一个空的管道,则read将被阻塞;
  • write系统调用往一个满的管道写入数据,则write将被阻塞;
  • 写端关闭,针对管道的read操作将返回0,读取到了文件结束标记(EOF);
  • 读端关闭,write操作将失败,并触发SIGPIPE信号;
#include<sys/types.h>
#include<sys/socket.h>
int socketpair(int domain, int type, int protocol, int fd[2]);

可用来创建双向管道;
实现信号时,可用于在父进程和子进程之间传递信号,当有信号产生时,调用信号处理函数,会将信号传递给主线程,在主线程的IO复用下进行接收处理;

dup和dup2

#include<unsitd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one, int file_descriptor_two);

dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符file_descriptor指向相同的文件、管道、网络连接,dup返回的文件描述符总是取系统当前可用的最小整数值;

dup和dup2创建的文件描述符并不继承原文件描述符的属性,比如close-on-exec和non-blocking;

readv函数和writev函数

readv函数将数据从文件描述符读到分散的内存块中,即分散读;
writev函数则将多块分散的内存数据一起写入文件描述符中,即集中写;

#include<sys/uio.h>
ssize_t readv(int fd, const struct iovec* vector, int count);
ssize_t writev(inr fd, const struct iovec* vector, int count);

sendfile函数

sendfile 函数在两个文件描述符之间直接传递数据(完全在内核中),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,称为零拷贝;

#include<sys/sendfile.h>
ssize_t sendfile(int out_fd,    /*待写入内容的文件描述符*/
                 int in_fd,     /*待读出内容的文件描述符*/
                 off_t* offset, /*从读入文件哪个位置读*/
                 size_t count); /*传输的字节数*/
  • in_fd必须是一个支持类似mmap函数的文件描述符,即其必须指向真实的文件,不能是socket和管道;
  • out_fd必须是一个socket;
  • sendfile几乎专门为在网络上传输文件而设计的;

mmap和munmap函数

mmap函数用于申请一段内存空间,可以将这段内存作为进程间通信的共享内存,也可以将文件映射在其中

#include<sys/mman.h>
void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void* start, size_t length);
  • prot参数用来设置内存段的访问权限,它可以取以下几个值的按位或:

    • PROT_READ:内存段可读
    • PROT_WRITE:内存段可写
    • PROT_EXEC:内存段可执行
    • PROT_NONE:内存段不能被访问
  • flags参数控制内存段内容被修改后程序的行为:

    • MAP_SHARED:在进程间共享这段内存,对该内存段的修改将映射到文件中;
    • MAP_PRIVATE:内存段为调用进程私有,对该内存段的修改不会映射到文件中;
    • MAP_ANONYMOUS:这段内存不是从文件映射而来的,其内容被初始化为0;
    • MAP_FIXED:
    • MAP_HUGETLB:

tee函数

tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作,它不消耗源文件描述符上的数据,因此源文件描述符上的数据仍然可以用于后续的读操作;

#include<fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

将信号和文件描述符关联的方法:就是使用fcntl函数为目标文件描述符指定宿主进程或进程组,那么被指定的宿主进程或进程组将捕获信号;

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

高级I/O函数 的相关文章

  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

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

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件 我想到的第一个解决方案是使用find管道与xargs grep find iname py xargs grep e YOUR PATTERN 但是 如果我需要查找跨越多行的模式 我就会陷入困境 因为
  • 为 OpenWrt 编写和编译程序

    我有一个在 OpenWRT 下运行的具有 MIPS 架构的嵌入式设备 系统类型 MediaTek MT7628AN ver 1 eco 2机器 WRTnode2P 处理器 0CPU型号 MIPS 24KEc V5 5 我想通过我的电脑 ub
  • Ubuntu 的打包 - Web 应用程序

    Web 应用程序没有与 C 或类似文件不同的 make 文件 但是 它需要放置在特定的目录中 例如 var www 我是 Linux 打包新手 所以我的问题是 如何将我的应用程序打包到 deb 中 以便在安装时将其放入 etc myprog
  • 如何在Linux中自动启动需要X的应用程序

    我试图在系统进入运行级别 5 时自动启动 X 应用程序 这样做的正确方法是什么 我写了一个脚本并将其放在 etc init d 中 我已运行适当的 chkconfig 命令来设置 etc rcX d 目录中的符号链接 一切工作正常 除了当我

随机推荐

  • el-select 下拉框有值却无法选中

    场景 el select 下拉框数据是从接口获取的大量数据 点击选项后 在 change 函数中查看是值已经发生变化了 但在页面上没有显示新改变后的值 也就是下拉框的值无法选中 解决方法 在 el select 的 change 事件绑定
  • tensorflow问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0

    在 tensorflow 实战Google深度学习框架 中的7 2 1节 Tensorflow图像处理函数 一段小代码 使用Tensorflow读入图像 代码如下 运行时发生错误如下 解决方法 问题原因 第一 第二 我们来看下tf gfil
  • idea java 远程调试_使用idea开启远程调试

    jar程序运行在远程服务器上出现错误 又没有明确的错误日志能够查看得到 无从下手 这篇文章获取可以帮助一二 这里我来分享一种通过idea实现远程调试的方法 几个及其简单的操作就可以使我们定位远程服务器的错误时更加得心应手 一 在idea端进
  • websocket中spring注入service对象失败问题处理

    因为在spring中controller service dao默认都为单例模式 而websocket为多线程的 websocket初始化时 非连接用户 会将 Autowired的对象注入成功 后面创建socket链接后会注入为null 因
  • 复现XSS漏洞

    一 设置漏洞环境 首先 我们需要一个包含XSS漏洞的Web应用 我们可以使用一个简单的示例页面来模拟漏洞 以下是一个基本的示例代码 h1 欢迎来到我们的网站 h1
  • pygame入门

    二 创建游戏窗口 要使用pygame首先需要进行初始化 import pygame 初始化pygame pygame init 想要运行一个游戏 一定要有用于运行游戏的窗口 创建窗口pygame display set mode 在括号里可
  • C++总结笔记(十一)—— Lambda表达式的应用

    文章目录 一 Lambda表达式是什么 二 程序示例 1 在STL中的使用 一 Lambda表达式是什么 Lambda表达式时C 11引入的语法 本质上是一个匿名函数 用 三个符号组成表达式 格式为 capture list params
  • CSS清除浮动及手写clearfix

    清除浮动的方法 使用clear both清除浮动 clear both意思就是清除浮动 clear clear both verflow方法的使用 当给父元素设置了overflow样式 不管是overflow hidden或overflow
  • android 浅探打包安装APK

    打包安装过程 Run as Android Application 1 生成apk文件 1 生成 dex文件 DVM java gt javac gt class gt dx bat gt dex 架构 寄存器 cpu上一块高速的缓存 2
  • 谷歌地图旋转图片marker(图片旋转转base64)

    custom rotate icon method for Google map var RotateIcon function options this options options this rImg options img new
  • QT中使用winsock创建Tcp连接传文件

    第一步链接库 qmake LIBS lws2 32 cmake target link libraries send send是项目名称替换自己的 PUBLIC lt
  • 小程序动画 animation 的常规使用

    公司小程序项目比较多 最近正好有时间看一下小程序的动画 同时记录一下我的学习过程 看到这个文章的 我建议你直接去小程序后台 https developers weixin qq com miniprogram dev api ui anim
  • 从零开始教你如何完成一个基于Vite+Vue3+TS的后台管理系统

    项目大致效果 心动了吗 没错 没错 你没看错 在学习了前端也有一年多的时间了 先后学习了 html css html5 css3 js 微信小程序 nodejs vue react ts等 现在也是时候来对之前学的知识进行一个综合的练习了
  • c语言文件操作

    目录 一 什么是文件 1 1 程序文件 1 2 数据文件 1 3 文件名 二 文件的打开和关闭 2 1 文件指针 2 2 文件的打开和关闭 2 3 文件的顺序读写 编辑 三 文件的随机读写 3 1 fseek ftell rewind 四
  • Android WebView加载本地统一HTML界面样式文件并填充内容

    前言 之前加载HTMl图文都是使用TextView 但是现在需要统一三个端的样式 给出了一个HTML文件 我想反正都是HTML格式的 TextView应该也没问题 我就将文本直接填充进去 一运行 发现Html fromHtml 无法解析 l
  • ARM芯片开发(S5PV210芯片)——SD卡启动

    1 SD卡启动 顾名思义就是启动代码存放在SD卡中 设备从SD卡中启动 用SD卡启动有一些好处 譬如可以在不借用专用烧录工具 类似Jlink 的情况下对SD卡进行刷机 然后刷机后的SD卡插入卡槽 SoC既可启动 譬如可以用SD卡启动进行量产
  • 边缘云计算简介

    去年底 中国电子技术标准化研究院 阿里云等单位共同编制并发布了一份 边缘云计算技术与标准化白皮书 定义了边缘云计算的概念和标准等 白皮书篇幅略长 边缘计算社区将通过几篇文章拆解白皮书 边缘计算概念 和云计算出现的时候一样 目前业界对边缘计算
  • UniswapV2核心合约学习(1)— UniswapV2Factory.sol

    记得朋友圈看到过一句话 如果Defi是以太坊的皇冠 那么Uniswap就是这顶皇冠中的明珠 Uniswap目前已经是V2版本 相对V1 它的功能更加全面优化 然而其合约源码却并不复杂 本文为个人学习UniswapV2源码的系列记录 一 Un
  • 笔记/mysql数据库备份与恢复

    MySQL mysqldump命令详解 1 数据库信息 数据库地址 127 0 0 1 数据库用户名 root 数据库密码 1234 数据库名称 test1 数据库名称 test2 数据库名称 test3 mysqldump目录 usr b
  • 高级I/O函数

    应用层程序能往一个TCP连接中写入多少字节的数据 取决于对方的接收窗口的大小和本端的拥塞窗口的大小 管道本身有一个容量限制 规定如果应用程序不将数据从管道读走的话 该管道最多能写入多少字节的数据 自Linux 2 6 11内核起 管道容量的