网络 I/O 通常包含两个阶段:等待事件就绪,以及在用户空间与内核之间复制数据。高并发服务器的核心不是让一次复制凭空消失,而是更高效地管理大量连接上的等待、就绪和状态推进。
本文介绍五种经典 I/O 模型,重点分析 select、poll 和 epoll,并给出一个正确处理非阻塞读写、边缘触发和输出缓冲区的 epoll 回显服务器。
...
Socket 是应用程序使用网络协议栈的主要接口。Linux 把套接字抽象为文件描述符,因此可以使用 read、write、close,也可以使用更适合网络语义的 recv、send、recvfrom 和 sendto。
本文从 IP、端口和网络字节序出发,分别梳理 UDP 与 TCP 的编程流程,并给出经过边界和错误处理完善的示例。
一、网络通信需要哪 ...
线程是进程内部的执行流。多个线程共享同一进程的大部分资源,因此创建和切换成本通常低于进程,但共享也会带来数据竞争、死锁、丢失唤醒和生命周期管理等问题。
本文以 POSIX Threads 为主线,讲解线程创建、退出、等待、分离,以及互斥锁、条件变量、信号量、读写锁、生产者消费者模型和线程池设计。
一、进程与线程1.1 线程是什么线程可以理解为进程内部的一 ...
Linux 信号是一种异步事件通知机制。内核、终端或其他进程可以向目标进程发送信号,目标进程再按照默认动作、忽略规则或自定义处理器作出响应。
信号适合表达“发生了某件事”,不适合直接传输大量业务数据。真正掌握信号,需要理解信号的产生、未决、阻塞、递达、捕获,以及处理器中的异步安全约束。
一、信号是什么信号可以理解为发送给进程或线程的一个编号。它的特点是: ...
进程具有独立的虚拟地址空间,一个进程通常不能直接访问另一个进程的变量。为了让多个进程交换数据、同步状态或传递事件,操作系统提供了进程间通信机制,即 IPC(Inter-Process Communication)。
本文从匿名管道开始,依次介绍命名管道、System V 共享内存、消息队列和信号量,并给出可以直接编译运行的示例。
一、为什么需要进程间通信 ...
Linux进程控制可以概括为一条主线:父进程用fork创建子进程,子进程用exec装入新程序,进程用exit或_exit终止,父进程再用wait/waitpid回收退出状态。Shell启动外部命令、服务器派生工作进程和测试框架运行子任务,都建立在这条主线上。
本文系统解释fork的两次返回与写时拷贝、进程退出和标准I/O缓冲、僵尸进程、等待状态宏、 ...
Linux开发工具链不是若干彼此无关的命令:包管理器负责安装工具,Vim完成编辑,GCC把源代码变成程序,GDB观察运行状态,Make根据依赖关系组织构建,Git记录并协作代码变更。
本文以C/C++开发为主线,系统整理apt/dnf/yum、Vim、GCC/G++、GDB、Makefile和Git,并提供一个包含头文件、多个源文件、自动 ...
Linux命令不是一组孤立的背诵题。ls、find、grep、重定向和管道共同构成数据处理流程;用户、组、文件权限和目录权限则决定这些流程能否访问目标对象。
本文从Shell、路径和目录树讲起,系统整理文件操作、查看、查找、压缩、系统信息与帮助命令,并深入解释rwx、八进制权限、umask、所有者、用户组、目录删除条件和粘滞位。所有危险命令都会明确边界,避免 ...
学习Linux首先要获得一个稳定、可重复、敢于实验的环境。环境选择并不存在唯一答案:WSL2启动快,虚拟机隔离完整,云服务器适合远程开发和项目部署,物理机则提供最直接的硬件体验。
本文从Linux、内核和发行版的关系讲起,对比常见搭建方式,给出云服务器初始化、普通用户与sudo、SSH密钥登录、客户端配置和安全检查流程,并提供一份无修改操作的环境自检脚本。
...
系统梳理 Linux 基础 I/O,涵盖文件描述符、重定向、缓冲区、文件系统以及静态库与动态库的原理和常用接口。
