深入解析I/O底层:文件描述符与缓冲区真相

I/O多路复用与异步I/O原理深度解析:从BIO到epoll再到AIO I/O模型是高并发系统性能的底层基石,其本质是解决CPU与慢速设备(如网络、磁盘)之间的效率失配问题。阻塞I/O(BIO)依赖线程独占等待,导致资源爆炸;I/O多路复用(如epoll)通过内核事件通知机制,实现单线程高效管理海量连接,显著降低上下文切换与内存开销;异步I/O(AIO)则进一步将数据搬运全程委托内核,以回调驱动实现真正无阻塞。这些技术共同支撑了Redis、Netty、Kafka等高性能中间件的低延迟与高吞吐能力。本文结合Linux内核源码、JVM NIO实现及可验证Demo,深入剖析selec 阅读详情

本文要回到一个更基础、也更贴近日常开发的话题:操作系统中的基础 I/O。

在 C++ 里用 std::cout、fstream,在 C 里用 printf、fopen,它们背后到底发生了什么?打开文件时那些 O_RDONLY、O_CREAT 是什么意思?文件描述符又是什么东西?为什么有时候 printf 的输出没有立刻出现?缓冲区在其中扮演了什么角色?

本文就试着把这些问题一次讲透。


1. 从两个层面看 I/O

在 Linux 中,文件 I/O 可以分为两个层次:

层次代表接口特点
标准库 I/Ofopen/fread/fwrite/fclose、std::fstream、std::cout带用户态缓冲区,可移植,使用方便
系统调用 I/Oopen/read/write/close/lseek直接进入内核,无用户态缓冲,更底层、更可控

两者不是对立的。标准库 I/O 最终也是通过系统调用完成的,只是它在用户态加了一层缓冲区来减少系统调用的次数。

理解基础 I/O,必须从系统调用这一层入手。


2. 文件描述符(File Descriptor)

2.1 什么是文件描述符?

当你用系统调用打开一个文件时,内核会返回一个非负整数,这个整数就是文件描述符(fd)。它是进程打开文件表中的一个索引。

Linux 进程启动时,默认打开三个文件描述符:

fd名称宏默认指向
0标准输入STDIN_FILENO键盘/终端
1标准输出STDOUT_FILENO终端屏幕
2标准错误STDERR_FILENO终端屏幕

之后打开的文件会分配最小的可用 fd。比如关闭了 fd 1,下一次 open 就可能返回 1。

#include <unistd.h>
#include <fcntl.h>
#include <iostream>

int main() {
    int fd = open("test.txt", O_RDONLY);
    std::cout << "打开的文件描述符: " << fd << "\n";  // 通常是 3
    close(fd);
    return 0;
}

2.2 文件描述符的本质

每个进程在内核中有一张打开文件描述符表,fd 就是这张表的索引。表项指向一个打开文件表项(open file description),其中记录了:

  • 文件偏移量(offset)

  • 打开标志(只读、只写、追加等)

  • 引用计数

  • 指向 inode 的指针

多个 fd 可以指向同一个打开文件表项(例如 fork 后父子进程共享偏移量,或 dup 复制 fd)。这一点对理解重定向和文件共享非常关键。

进程 A 的 fd 表          打开文件表项           inode
   fd 0 ──────────────►  offset, flags ──────► 文件元数据
   fd 1 ──────────────►  ...
   fd 3 ──────────────►  offset=0, O_RDONLY ──► test.txt

3. 打开文件:open 与打开方式

3.1 open 函数原型

#include <fcntl.h>

int open(const char* pathname, int flags);
int open(const char* pathname, int flags, mode_t mode);
  • pathname:文件路径。

  • flags:打开方式,多个标志用按位或 | 组合。

  • mode:仅在创建新文件时使用,指定权限(如 0644)。

  • 成功返回文件描述符,失败返回 -1 并设置 errno。

3.2 常用打开标志

标志含义
O_RDONLY只读
O_WRONLY只写
O_RDWR读写
O_CREAT文件不存在时创建(需提供 mode)
O_EXCL与 O_CREAT 合用,文件已存在则失败
O_TRUNC文件存在时截断为 0 长度
O_APPEND每次写入都追加到文件末尾
O_NONBLOCK非阻塞模式(对管道、设备等有用)
O_SYNC同步写入,write 返回时数据已落盘

注意:O_RDONLY、O_WRONLY、O_RDWR 三者是互斥的,只能选一个。

3.3 常见组合示例

// 只读打开
int fd1 = open("data.txt", O_RDONLY);

// 创建并写入(不存在则创建,存在则清空)
int fd2 = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);

// 追加写入(不存在则创建)
int fd3 = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0644);

// 安全创建:文件已存在则失败,防止覆盖
int fd4 = open("lock.txt", O_WRONLY | O_CREAT | O_EXCL, 0644);
if (fd4 == -1) {
    // errno == EEXIST 表示文件已存在
}

3.4 mode 与 umask

mode 指定新文件的权限,但实际权限是 mode & ~umask。例如 mode=0666、umask=022,实际创建的文件权限是 0644。

int fd = open("new.txt", O_WRONLY | O_CREAT, 0666);  // 实际可能是 0644

4. 读写与定位:read / write / lseek / close

4.1 read

#include <unistd.h>

ssize_t read(int fd, void* buf, size_t count);
  • 从 fd 当前偏移处读取最多 count 字节到 buf。

  • 返回实际读取的字节数;返回 0 表示到达文件末尾;返回 -1 表示出错。

  • 返回值可能小于 count,必须循环读取才能读完。

4.2 write

ssize_t write(int fd, const void* buf, size_t count);
  • 将 buf 中最多 count 字节写入 fd。

  • 返回实际写入的字节数,可能小于 count(如磁盘满、被信号中断),同样需要循环写。

4.3 lseek

off_t lseek(int fd, off_t offset, int whence);

调整文件偏移量:

  • SEEK_SET:从文件开头算起

  • SEEK_CUR:从当前位置算起

  • SEEK_END:从文件末尾算起

4.4 close

int close(int fd);

关闭文件描述符,释放相关资源。进程退出时内核会自动关闭,但显式关闭是好习惯,也能及时释放 fd 供后续使用。


5. 缓冲区:I/O 性能的关键

5.1 两层缓冲区

I/O 路径上通常有两层缓冲区:

应用程序缓冲区  →  内核页缓存  →  磁盘
   (用户态)         (内核态)
  • 用户态缓冲区:由标准库(如 FILE*、std::iostream)维护,用来减少系统调用次数。比如 fwrite 写 1 个字节,可能只是放进缓冲区,等缓冲区满了才真正调用 write。

  • 内核页缓存(page cache):内核在内存中缓存磁盘数据,write 返回时数据通常只到了页缓存,由内核在合适时机刷盘。

5.2 标准库 I/O 的缓冲模式

模式行为典型场景
全缓冲缓冲区满时才刷新文件
行缓冲遇到换行符或缓冲区满时刷新终端
无缓冲立即输出stderr

这就是为什么 printf("hello") 不带换行时,在终端可能看不到输出,而 printf("hello\n") 能立即看到。

5.3 经典陷阱:fork 与缓冲区

#include <cstdio>
#include <unistd.h>

int main() {
    printf("Hello");   // 没有换行,留在缓冲区
    fork();
    return 0;
}

输出会出现两次 Hello!因为 fork 复制了用户态缓冲区,父子进程各自在退出时刷新一次。

如果改成 printf("Hello\n"),终端是行缓冲,换行会立即刷新,fork 时缓冲区已空,就不会重复。

结论:在 fork 之前应刷新缓冲区,或子进程使用 _exit 而非 exit。

5.4 手动刷新缓冲区

fflush(stdout);        // C 标准库
std::cout << std::flush;  // C++ 流

5.5 系统调用 I/O 没有用户态缓冲

write 是直接系统调用,数据直接交给内核。所以下面两种写法效果不同:

// 系统调用:立即进入内核
write(1, "hello", 5);

// 标准库:可能只是放入缓冲区
printf("hello");

如果需要控制刷新时机,系统调用 I/O 更直接。但频繁的 write 系统调用开销较大,标准库的缓冲正是为了优化这一点。

5.6 缓冲区与同步

write 返回成功,不代表数据已经写到磁盘,只表示数据进入了内核页缓存。要保证落盘,可以:

int fd = open("data.txt", O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, 0644);
// 或者写完后调用
fsync(fd);   // 将文件数据刷到磁盘
fdatasync(fd); // 只刷数据,不刷元数据

6. FILE* 与 fd 的关系

C 标准库的 FILE* 内部封装了一个文件描述符。可以用 fileno 获取:

#include <cstdio>

FILE* fp = fopen("test.txt", "r");
int fd = fileno(fp);   // 获取底层 fd

常用流对应的 fd:

流fd
stdin0
stdout1
stderr2

fopen 的 "r"、"w"、"a" 等模式,最终会转换为 open 的标志位。例如:

fopen 模式等价 open 标志
"r"O_RDONLY
"w"O_WRONLY | O_CREAT | O_TRUNC
"a"O_WRONLY | O_CREAT | O_APPEND
"r+"O_RDWR
"w+"O_RDWR | O_CREAT | O_TRUNC

7. 重定向与 dup2

7.1 dup / dup2

#include <unistd.h>

int dup(int oldfd);              // 返回新的 fd,指向同一个打开文件表项
int dup2(int oldfd, int newfd);  // 让 newfd 也指向 oldfd 的表项

dup2 常用于重定向:先打开一个文件,然后用 dup2 把它复制到标准输出/标准错误的位置。

7.2 示例:将标准输出重定向到文件

#include <fcntl.h>
#include <unistd.h>
#include <cstdio>

int main() {
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    dup2(fd, STDOUT_FILENO);   // 让 fd 1 指向 output.txt
    close(fd);                 // 原来的 fd 可以关闭

    printf("这行会写入 output.txt\n");
    return 0;
}

7.3 示例:shell 中的重定向

./program > out.txt      # 等价于 open + dup2(fd, 1)
./program 2> err.txt     # 重定向标准错误
./program < input.txt    # 重定向标准输入

在代码层面,shell 就是通过 fork + open + dup2 + exec 实现重定向的。

7.4 恢复重定向

如果想临时重定向后恢复,可以先用 dup 保存原来的 fd:

int saved = dup(STDOUT_FILENO);
int fd = open("temp.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
dup2(fd, STDOUT_FILENO);
printf("写入临时文件\n");
fflush(stdout);
dup2(saved, STDOUT_FILENO);  // 恢复
close(saved);
close(fd);
printf("回到终端\n");

8. 常见误区与注意事项

  1. read/write 返回值必须检查
    它们可能返回小于请求字节数,甚至被信号中断返回 -1(errno == EINTR)。必须循环处理。

  2. 文件描述符是进程级资源
    fork 后父子进程共享打开文件表项,但 fd 表各自独立。dup 出的 fd 共享偏移量。

  3. 缓冲区可能导致输出“丢失”
    程序异常终止(如 _exit、段错误)时,用户态缓冲区不会刷新,printf 的内容可能丢失。

  4. O_APPEND 与多进程写入
    O_APPEND 保证每次写入原子地追加到末尾,适合多进程写日志。但普通 write 配合手动 lseek 不是原子的。

  5. 不要混用标准库 I/O 和系统调用 I/O
    对同一个文件既用 FILE* 又用 read/write,可能因缓冲区导致数据顺序错乱。

  6. 及时 close
    fd 是有限资源(通常默认上限 1024),泄漏会导致“Too many open files”。


9. 小结

主题核心要点
文件描述符非负整数,进程打开文件表的索引;0/1/2 是标准输入/输出/错误
打开方式O_RDONLY/O_WRONLY/O_RDWR 互斥;O_CREAT、O_TRUNC、O_APPEND 等组合
基本操作open、read、write、lseek、close
缓冲区用户态缓冲区(标准库)+ 内核页缓存;全缓冲/行缓冲/无缓冲
重定向dup2 改变 fd 指向,实现输入输出重定向
FILE 与 fd*FILE* 封装了 fd,fileno 可取底层 fd
  • 系统调用 I/O 无用户态缓冲,直接与内核交互,适合需要精细控制的场景。

  • 标准库 I/O 带缓冲,减少系统调用,使用方便,但要注意刷新时机。

  • 理解 fd、打开文件表项和缓冲区,是排查 I/O 问题和实现重定向的基础。


基础 I/O 是系统编程的根基,也是理解文件、管道、网络套接字统一抽象(一切皆文件)的入口。掌握了 fd 和缓冲区,就能看清很多“奇怪”现象背后的原因。

epoll与io_uring深度对比:I/O多路复用与真正异步I/O的本质差异 I/O模型是操作系统与应用程序协同处理数据流动的基础机制。从阻塞I/O到非阻塞轮询,再到I/O多路复用(如epoll)和真正异步I/O(如io_uring),其演进核心在于‘等待成本’的转移路径:由线程挂起、忙等、事件驱动,最终走向内核全权接管与零拷贝完成。epoll通过红黑树+就绪链表实现高效事件通知,已成为高并发网络服务的事实标准;而io_uring依托共享内存环形缓冲区与内核专用线程,突破系统调用瓶颈,支撑存储与网络I/O的极致性能。二者并非替代关系,而是适配不同负载特征——epoll胜在确定性低延迟 阅读详情

相关推荐

Linux内核四大支柱:调度、内存、I/O与安全机制解析

内核(Kernel)是操作系统与硬件之间的核心枢纽,负责资源抽象、权限管控与系统协调。其本质是一套运行在CPU最高特权级的精密契约体系,通过系统调用提供受控访问接口。核心原理围绕四大子系统展开:CPU调度器实现公平时间片分配与上下文切换;内存管理构建虚拟地址空间,支撑隔离、swap与OOM控制;I/O子系统统一设备驱动模型与页缓存机制,平衡性能与一致性;安全框架依托ring0/ring3隔离、SELinux等强制访问控制保障最小权限。这些机制共同支撑云计算、AI训练(如PyTorch CUDA错误)、嵌入式

weixin_34357436的博客 408

【Linux】十四.《文件描述符与重定向底层揭秘:Linux 文件 I/O 进阶完全指南》

缓冲区是内存空间的⼀部分。也就是说,在内存空间中预留了⼀定的存储空间,这些存储空间⽤来缓冲输⼊或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设备,分为输⼊缓冲区和输出缓冲区。

2501_93351213的博客 765

BIO、NIO、AIO实战对比:从线程爆炸到内核代工的I/O演进

I/O模型是高性能网络编程的底层基石,本质是操作系统与用户程序之间数据搬运方式的契约。其核心原理在于阻塞/非阻塞、同步/异步的组合差异:BIO依赖线程一对一等待,资源消耗呈线性增长;NIO通过事件驱动与多路复用(如epoll)实现单线程监控海量连接,大幅提升CPU与内存利用率;AIO则将读写操作完全委托内核异步完成,进一步消除用户态轮询开销。该技术路径直接决定系统在高并发场景下的扩展能力与稳定性,广泛应用于Web服务器(Tomcat/NIO)、通信框架(Netty)、中间件(Redis单线程+epoll)及

didi9310的博客 392

EAGAIN错误码深度解析:Linux非阻塞I/O的底层原理与实战指南

在Linux系统编程中,errno错误码是理解I/O行为的关键,而EAGAIN作为其中高频出现的一项,常让开发者误以为程序出错。实际上,EAGAIN表示“资源暂时不可用”,是非阻塞I/O模式下的正常信号,与EWOULDBLOCK同义,广泛出现在socket、管道、文件锁等场景。理解其底层原理,掌握正确的重试与事件驱动处理方式,是构建高并发网络服务的基础。通过epoll等I/O多路复用机制,EAGAIN能帮助我们实现高效的读写调度,避免忙等待和资源浪费。无论是服务端开发还是嵌入式编程,只有深刻理解EAGAIN

weixin_30357231的博客 364

C++文件操作底层机制与性能优化实践

文件操作是编程中的基础但关键的技术,涉及系统调用、缓冲区管理和磁盘I/O调度等底层机制。理解这些原理不仅能优化I/O性能,还能解决跨平台兼容性和数据安全等问题。在实际应用中,合理选择缓冲区大小、使用批量写入和异步I/O等技术可以显著提升性能。例如,通过内存映射和双缓冲队列,日志系统的吞吐量可达到每秒50万条。掌握这些技术,开发者能够编写出高效可靠的C++文件处理代码,适用于高频交易、大数据处理等场景。

weixin_34111790的博客 320

I/O交互支持库详解与实战应用

经过这一番深入探索,我们可以归纳出几条黄金法则:🟢正确使用缓冲- 顺序 I/O 使用大缓冲(64KB~256KB)- 交互输出保留行缓冲- 关键数据记得fflushfsync🟢防范资源泄漏fopen必须检查返回值fclose后置空指针- 使用atexit或 RAII 确保释放- 定期用lsof查看句柄数🟢线程安全第一- 多线程共享FILE*必须加锁- 或者改用无锁日志库。

weixin_35094083的博客 627

标准IO与系统IO的本质区别:缓冲模型与文件描述符的底层解析

标准IO和系统IO是C语言中两种根本不同的I/O抽象机制:前者基于用户空间缓冲区和格式化封装,后者直接映射内核系统调用与文件描述符。其核心差异在于数据流向控制权归属——标准IO由`FILE*`管理缓冲生命周期,系统IO由fd直通内核file结构体。这种分层导致在`fork()`、`fflush()`、`fsync()`及多线程日志等场景下行为迥异,直接影响程序可靠性与调试可追溯性。理解二者在缓冲策略、错误处理(如EINTR重试)、资源清理语义上的设计哲学,是构建高性能、高稳定UNIX/Linux服务的基础能

weixin_33428613的博客 283

C语言文件读写避坑:FILE结构体、缓冲区与fopen模式

C语言文件读写中,FILE*并非磁盘文件本身,而是指向用户态缓冲区与读写游标的控制块;fopen通过open获取文件描述符,fprintf先格式化写入缓冲,fgets按块预取数据,缓冲区刷新与游标切换决定数据何时真正落盘。理解这一机制,能解释写入完成却读不到、末尾少行、feof误判、文本模式改写字节等常见现象,并指导fopen模式选择、fflush/fclose出口管理、setvbuf缓冲策略及二进制安全读写。在日志落盘、配置覆盖、批量数据导入、解析文本行和跨平台文件处理中,把FILE结构体、缓冲区刷新和模

weixin_29574585的博客 253

彻底搞懂 I/O 多路复用:并发、线程与五大语言高并发模型底层差异

本文系统讲解了I/O多路复用技术及其在高并发服务中的核心作用。主要内容包括: 并发与并行的本质区别:并发是时间片轮转的"假同时",并行是多核CPU的"真同时"。 I/O操作的痛点:CPU运算速度与磁盘/网卡存在数量级差距,传统阻塞I/O导致线程资源浪费。 五种I/O模型对比:重点分析阻塞I/O、非阻塞I/O和I/O多路复用的工作原理及性能差异。 I/O多路复用的核心价值:单线程通过系统调用批量监控多个连接,仅处理就绪的I/O事件,实现海量并发连接的高效管理。 多线程模型的局限性:线程资源昂贵、上下文切换开销

jieyucx的博客 420

C# 读取图片和扫描PDF中的文本

本博客将探讨如何使用C#和OCR库实现从图片和扫描的 PDF 中提取文本。Spire.OCR for .NET 是一个OCR文字识别库,专为在 .NET 应用程序中识别图片的文本而设计。首先,使用 Spire.PDF 将扫描的 PDF 转换为图片,然后利用 Spire.OCR 从这些图片中提取文本。由于该OCR库并不支持直接处理PDF,因此要从扫描的 PDF 中提取文本,我们首先需要将 PDF 文档转换为图片。转换完成后,再利用 Spire.OCR 从生成的图片中提取文本。方法来识别图片中的文本。

nuclear2011的博客 5401

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1141

【Linux】十三.《从 “一切皆文件“ 到底层系统调用:Linux 文件 I/O 完全解读》

pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1。

2501_93351213的博客 1151

Adobe软件非正版弹窗终极解决方案:PS/Ai/PR/AE禁用提示一键清除指南

本文提供了Adobe软件非正版弹窗的终极解决方案,包括PS、Ai、PR、AE等软件的禁用提示一键清除指南。通过专业清理工具和手动修改系统文件的方法,帮助用户彻底解决Adobe弹窗问题,提升使用体验。适用于Windows和Mac系统用户,操作简单高效。

weixin_30872337的博客 5325

零拷贝原理与实战:从mmap到sendfile的I/O优化全解析

在高性能网络编程中,数据搬运效率直接决定服务吞吐能力。传统read+write路径下,数据从磁盘到网卡需要经历多次CPU拷贝和用户态/内核态切换,导致CPU占用飙升、带宽跑不满。零拷贝技术正是针对这一痛点,通过减少CPU参与的拷贝次数(甚至降为零)来优化I/O路径。文章从传统I/O代价切入,系统剖析mmap+write、sendfile、splice、copy_file_range等主流方案的工作原理与适用场景,并结合可运行C代码与Nginx配置演示如何落地。无论你是刚接触网络编程的开发者,还是好奇Kafk

weixin_34072296的博客 340

从扇束到平行束:等角重排算法在CT重建中的核心原理与MATLAB实践

本文深入解析了CT图像重建中等角扇束重排算法的核心原理与MATLAB实现。通过将实际采集的扇束投影数据,利用几何映射和两次关键插值,转换为适用于经典滤波反投影算法的平行束数据,打通了高效重建的关键路径。文章结合Shepp-Logan模型仿真,提供了完整的MATLAB代码实践,并分析了源-物距、采样率等关键参数对重建质量的影响。

cnn8visionary的博客 647

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4261

深入理解文件系统(三):重定向与dup/dup2系统调用原理与实践

Linux重定向机制解析 本文深入探讨了Linux系统中>重定向符号背后的工作原理。通过Shell解析、系统调用追踪和内核文件描述符分析,揭示了重定向的核心机制。关键点包括: Shell将command > file分解为解析命令、创建子进程和设置重定向等步骤 使用strace可观察到openat、dup2等关键系统调用 文件描述符作为进程访问文件的"合约编号",标准输入/输出/错误分别对应0/1/2 dup2系统调用通过原子性地替换文件描述符表条目实现重定向 实际代码示例展

aramae的博客 933

史上最强量化工具库 Ta-Lib 从入门到精通,一篇文章就够了!

Ta-Lib 提供的 13 个关键指标,并配上详细的代码示例,确保你看完就能直接上手!🔥。

奔跑的蜗牛 9921

Node.js事件循环与单线程真相:I/O密集型架构核心解析

Node.js常被误读为‘单线程阻塞模型’,实则是基于事件驱动的异步I/O调度系统。其核心在于事件循环(Event Loop)协调JavaScript主线程、V8引擎、libuv线程池与操作系统内核四层协作,将耗时操作卸载至后台,实现高并发低延迟。这种设计天然适配I/O密集型场景——如实时通信、API网关、流式数据处理,但不擅CPU密集型任务。理解event loop阶段(timers、poll、check等)与微任务/宏任务执行顺序,是避免回调地狱、定时器失准、长尾延迟等生产问题的关键。结合V8内存机制与

weixin_30765505的博客 332

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 621

机器视觉工程师如何进行高速运动物体捕获

硬件方面使用高帧率相机(如工业相机、高速摄像机)确保充足的光照条件使用高性能计算平台减少处理延迟软件方面背景减除技术快速分离运动物体卡尔曼滤波预测物体轨迹ROI技术减少计算量多线程处理提高实时性实际应用中的关键考量针对特定场景调整参数(如阈值、滤波器参数等)平衡计算资源与实时性要求结合特定领域知识优化算法(如物体运动特性)上述示例代码实现了一个基础的高速物体跟踪系统,通过背景减除和卡尔曼滤波实现对高速物体的检测和跟踪。

zhangzhechun_02的博客 625

Linux 底层明明是 open/read/write,为什么日常写C语言代码只见到 fopen/fread/fwrite?

额外扩展一下 open函数,这是操作系统原生的接口。但我们初学 C 语言写代码时,从头到尾见到的全是带 f 的函数,从来没见过原生的 open、read、write。这并不是知识点冲突,而是,本文彻底讲透二者的关系、区别、使用场景,补齐绝大多数初学者的知识盲区。

TDTC_XQ的博客 374

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux基础IO深度解析:文件描述符、重定向与缓冲区

从终端里一行printf开始,探索Linux输入输出体系的核心设计。文件描述符作为一切IO抽象的入口,将设备、管道、文件统一为字节流;重定向通过dup2系统调用实现“门后通道”的替换,让数据流按需转向;用户态与内核态缓冲区则决定数据何时真正落盘。理解这些概念,工程师能快速定位日志丢失、输出顺序错乱、fork后重复输出等诡异问题。本文结合系统调用与实战案例,层层剥开IO链路的每一环节,帮助你建立从库函数到内核的完整认知框架。

weixin_30984001的博客 124

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

揭秘fclose调用失败真相:3个你必须掌握的错误处理方案

掌握C语言fclose函数失败处理技巧,避免资源泄漏。详解文件关闭失败的常见场景、错误码判断与重试机制,结合实际代码演示三种可靠处理方案,提升程序健壮性,值得收藏。

CompiTide的博客 869

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mruby-io 完全指南:为 mruby 提供 IO 与 File 类的轻量文件 I/O 扩展

mruby-io 是 mruby 官方核心 gem,为嵌入式 Ruby 运行时补齐了 `IO` 与 `File` 两个关键类,让 mruby 程序能够读写文件、操作管道(pipe)、启动子进程(popen)以及处理标准输入输出。本文以 [deps/mruby/mrbgems/mruby-io/README.md](https://link.gitcode.com/i/7a961dc4e5f074f

gitblog_02581的博客 440

为什么大厂都在用零拷贝的缓冲区?真相令人震惊!

提升系统性能的秘诀?大厂都在用零拷贝的缓冲区实现高效数据传输。适用于高并发、大数据量场景,减少内存复制与CPU开销,显著提升I/O性能。核心原理与应用实践全解析,值得收藏。

CodeWhim的博客 855
上一篇: Linux进程控制四大核心操作
下一篇: 从0到1:一个字节的磁盘之旅
CCCCCCCCharlie
博客等级 码龄1年 2粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值