KalosAner Blog

「山穷水复疑无路,柳暗花明又一村。」

Linux 上常用的标准 IO 函数

一、引言 write 和 read 是通用的系统调用;recv 和 send 是专为网络通信设计的扩展接口,数据系统调用,但是用户可以对其进行封装;fread 和 fwrite 是标准 IO 库函数。 二、系统调用 系统调用在调用时会通过内核缓冲区对数据进行缓冲。 延迟写入 当程序调用 write 函数时,数据并不会直接写入磁盘,而是暂存内核缓冲区,批量地写入磁盘。这样多次小文件写...

IO 复用之 epoll

一、引言 IO复用之 select 介绍了基于 select 的 IO 复用方法,但是 select 函数每次需要向操作系统传递监视对象信息导致性能太低,并且每次都需要对所有的文件描述符进行遍历查看是否有事件到来。select 适用于服务器端访问量小需求可移植性的程序。 有一种方式只需要向操作系统传递一次监视对象,当监视范围或者内容发送变化时,函数只返回发生变化的部分。在 Linux 上...

多播与广播

一、引言 多播和广播都是向多个主机传递数据的方式,主要区别在于多播可以向多播组中的所有主机传递数据,广播可以向整个子网的所有主机传递数据。 二、多播 多播(Multicast)方式基于 UDP 传输数据。多播通信需要先建立多播组,加入该组的主机即可接收发往该多播组的数据。发送端只需要向多播组发送一次数据。每个多播组都有一个多播组 IP,多播组的 IP 属于 D 类 IP 地质(224....

send 和 recv 函数

一、引言 send 和 recv 函数是网络编程中基础的 I/O 函数,虽然在 Linux 上 write 和 read 函数也可以用来通信,但是 write 和 read 本质上是文件操作函数。send 和 recv 函数在 Linux 和 Windows 上很相似,兼容性更强。 二、Linux 中的 send 和 recv 函数原型: 1 2 3 4 5 #include <...

IO复用之 select

一、引言 I/O 复用是指一个进程维护多个 I/O 套接字。传统的通信可能每个套接字都需要一个进程维护,这样会占用更多的资源(进程需要分配内存),由于在服务过程中等待通信会占用大量的时候导致进程闲置,所以可以使用一个进程维护多个套接字。I/O 复用有多种方法:select、poll、epoll(Linux 专用)、kqueue(macOS/FreeBSD专用)、IOCP(Windows专用...

Writes and Write-Nots

原文: Writes and Write-Nots I’m usually reluctant to make predictions about technology, but I feel fairly confident about this one: in a couple decades there won’t be many people who can write. On...

SQL best practices – don’t compare count(*) with 0

原文: SQL best practices – don’t compare count(*) with 0 Every now and then I see something like this: 1 2 SELECT u.* FROM users u WHERE 0 = (SELECT COUNT(*) FROM addresses a WHERE a.user_id = u....

进程间通信之管道

一、引言 进程是内存分配的最小单位,所以每个进程之间的数据都是隔离的,但是有时候进程之间又需要通信,这时候就需要用到进程通信技术。 进程之间通信主要有几种技术:管道、消息队列、共享内存、信号量、信号、套接字、内存映射和远程过程调用。 二、管道 管道分为有名管道和无名管道。管道都是半双工通信,如果需要实现全双工通信需要使用两个管道。 shell 中的 ls -l | grep ...

多进程编程基础

一、引言 本文简单介绍一下多进程编程,Linux 系统提供多进程的系统调用 fork。多进程主要用来并行地执行任务,对于多核 CPU,当 CPU 有空余的核时就会并行地执行其中一个进程,如果没有多余的核时就会分时执行。进程是分配资源的最小单位。每个进程都有一个 PID 和 PPID,其值为大于 2 的整数。PID 为 1 的是 systemd 进程(之前叫做 init 进程),它是所有进程...

一键配置 LunarVim

一、引言 LazyVim 和 LunarVim 是两种流行的 Neovim 配置框架。LazyVim 是为那些喜欢最小配置但希望轻松扩展的用户设计的。LunarVim 是为那些想要一个功能丰富的 Neovim 环境而无需过多配置的用户设计的。它提供了许多默认的开发工具和插件,致力于成为一个“IDE-like”的编辑器。 LunarVim 的整个配置过程都可以通过命令行来完成,所以理论上可...