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

news/2024/6/16 23:59:32 标签: linux

目录

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.niftyadmin.cn/n/5045245.html

相关文章

Compose LazyColumn 对比 RecyclerView ,谁的性能更好?

LazyColumn 是 compose 中用来实现类似 RecyclerView 效果的控件 &#xff0c;但是大家都说LazyColumn性能比RecyclerView差太多&#xff0c;毕竟 RecyclerView google优化了十多年了&#xff0c;比RecyclerView差一点也正常&#xff0c;今天我们就用实际数据来对比LazyColumn和…

优化软件系统,解决死锁问题,提升稳定性与性能 redis排队下单

项目背景&#xff1a; 随着用户数量的不断增加&#xff0c;我们的速卖通小管家软件系统面临了一个日益严重的问题&#xff1a;在从存储区提供程序的数据读取器中进行读取时&#xff0c;频繁出现错误。系统报告了一个内部异常: 异常信息如下&#xff1a; 从存储区提供程序的数…

【lesson10】进程状态

文章目录 认识进程状态新建运行阻塞挂起 Linux具体的进程状态RSDtTXZ是什么为什么 认识进程状态 上面就是各种进程状态&#xff0c;上面都是理论进程状态理论进程状态放在哪个操作系统中都是正确的&#xff0c;但是具体的操作系统实现可能又会有所不同。 下面我们来理解进程状态…

Linux Systemd 配置开机自启

博文目录 文章目录 Systemd操作方式配置方式配置示例参考 Systemd Systemd 是一个用于启动、管理和监控 Linux 系统的初始化系统。它是许多现代 Linux 发行版中默认的初始化系统&#xff0c;取代了传统的 SysVinit 和 Upstart。 Systemd 的引入在 Linux 社区引起了一些争议&…

【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)

1、硬件平台 工控机 学生电源 DH系列伺服驱动器 电机 调试平台&#xff1a;DCH 2、如何利用dch驱动电机 点击可驱动电机 下面的步骤是比较关键的几步&#xff1a; 3、遇到的问题 不能成功驱动电机&#xff0c;还和厂家那边打电话&#xff0c;询问 发现是这…

标准化套利的使用

交易对象&#xff1a;目前使用郑商所&#xff0c;大商所的spd标准化套利组合进行交易。 交易平台&#xff1a;易盛极星极星产品网 手续费研究:白糖期货手续费和保证金2023年09月更新 - 九期网 本人使用的期货交易公司&#xff1a;中信期货&#xff08;幸亏资金量大&#xff…

python 二叉树,先序回溯,层序队列,队列基础用法,二叉树深度

文章目录 1.创建二叉树&#xff0c;先、中、后遍历2.n个节点有多少种二叉树&#xff0c;递归3.层序遍历4.队列基础用法五&#xff0c;二叉树深度搜索二叉树 1.创建二叉树&#xff0c;先、中、后遍历 # 创建二叉树 class TreeNode():def __init__(self, data, leftNone, rightN…

Linux 故障定位手段之保存某个时间段内的top结果

在Linux中对故障原因进行定位时&#xff0c;除了查看对应的软体运行日志、OS运行日之外&#xff0c;还可以查看 top 的资源消耗结果。 参考语句&#xff1a; 以CPU为基准列进行排序记录TOP结果 nohup top -d 1 -b -o %CPU | tee -a /tmp/cpu.txt & 语句含义&#xff1a;每…