当前位置: 首页 > news >正文

《Linux高性能服务器编程》--高级I/O函数

目录

1--Pipe()

2--dup() 和 dup2()

3--readv() 和 writev()

4--sendfile()

5--mmap() 和 munmap()

6--spice()

7--tea()

8--fcntl()


1--Pipe()

#include <unistd.h>
int pipe(int fd[2]);
// 成功返回0,失败返回-1

        pipe() 函数可用于创建一个管道,以实现线程间通信;

        fd[0] 和 fd[1] 分别构成管道的两端,fd[0] 只能用于从管道读出数据,fd[1] 只能用于往管道写入数据;因此要实现双向数据传输,必须使用两个管道;

        fd[0] 和 fd[1] 是阻塞的,当读取空管道时,会阻塞直到有数据,同理当写入满管道时,会阻塞直到管道有空间(默认管道容量为 65536 字节);

        如果写端 fd[1] 的引用计数减少至 0,即没有线程往管道写入数据时,读取 fd[0] 将返回 0,即读到 EOF;如果读端 fd[0] 的引用计数减少至 0,即没有任何进程从管道读取数据时,写入 fd[1] 将失败,并引发 SIGPIPE 信号;

#include<sys/types.h>
#include<sys/socket.h>
int socketpair(int domain, int type, int protocol, int fd[2]);
// 创建双向管道,成功时返回0,失败时返回-1,fd[0]和fd[1]可读可写;

2--dup() 和 dup2()

#include <unistd.h>
// 类似于复制 file_descriptor
int dup(int file_descriptor);
// 类似于复制 descriptor_one,返回的fd >= file_descriptor_two
int dup2(int file_descriptor_one, int file_descriptor_two);

        dup() 和 dup2() 用于创建一个新的文件描述符,新文件描述符和原有文件描述符指向相同的文件、管道或网络连接;

3--readv() 和 writev()

#include <sys/uio.h>
// 分散读,可能会读多次,返回读取的字节数
ssize_t readv(int fd, const struct iovec* vector, int count);
// 集中写,返回写入的字节数
ssize_t writev(int fd, const struct iovec* vector, int count);

4--sendfile()

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);
// 成功返回传输的字节数,失败返回 -1

        sendfile() 在两个文件描述符之间直接传递数据(完全在内核中操作),完全避免了内核缓冲区和用户缓冲区之间的数据拷贝,被称为零拷贝

        in_fd 表示待读出内容的文件描述符,其必须指向真实的文件,不能是管道和 socket;out_fd 必须是一个 socket

5--mmap() 和 munmap()

#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);

        mmap() 用于申请一段内存空间,其可作为进程间通信的共享内存,也可以将文件直接映射到内存空间中;munmap() 用于释放由 mmap 创建的内存空间;

6--spice()

#include <fcntl.h>
ssize_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags);

        splice() 用于在两个文件描述符之间移动数据(零拷贝);

        fd_in 和 fd_out 必须至少有一个是管道文件描述符;

7--tea()

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

        tea() 用于在两个管道文件描述符之间复制数据(零拷贝);tea() 不消耗数据(复制),因此源文件描述符的数据仍保留;

8--fcntl()

#include <fcntl.h>
int fcntl(int fd, int cmd, ...);

        fcntl() 提供了对文件描述符的各种控制操作;

http://www.lryc.cn/news/173012.html

相关文章:

  • 算法通关村 | 透彻理解动态规划
  • 数据结构(持续更新)
  • nginx部署vue后显示500 Internal Server Error解决方案
  • 微调大型语言模型(一):为什么要微调(Why finetune)?
  • 【GO】网络请求例子
  • 泡泡玛特海外布局动作不断,开启东南亚潮玩盛会
  • uniappAndroid平台签名证书(.keystore)生成
  • Gateway学习和源码解析
  • 移动机器人运动规划 --- 基于图搜索的Dijkstra算法
  • Mybatis SQL构建器
  • 怎么将几张图片做成pdf合在一起
  • 关于JPA +SpringBoot 遇到的一些问题及解决方法
  • ​全国馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许
  • linux升级glibc-2.28
  • [Go疑难杂症]为什么nil不等于nil
  • C#60个常见的问题和答案
  • 11:STM32---spl通信
  • kafka的 ack 应答机制
  • Django系列:Django开发环境配置与第一个Django项目
  • iPad协议/微信协议最新版
  • URL字符解码
  • uni-app进行表单效验
  • IO流内容总结
  • MySQL的进阶篇1-MySQL的存储引擎简介
  • 九芯电子丨语音智能风扇,助您畅享智慧生活
  • 2101. 引爆最多的炸弹;752. 打开转盘锁;1234. 替换子串得到平衡字符串
  • ​校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著
  • UOS服务器操作系统搭建离线yum仓库
  • C# 实现数独游戏
  • vscode + conda+ ffmpeg + numpy 的安装方式