Linux 系统调用手册

系统调用是用户态程序进入 Linux 内核的唯一入口。本手册综合了三份文档,涵盖 x86-64 调用约定与实战速查、350+ syscall 完整目录(Kernel 5.10)、以及 PlantUML 架构图(执行流程、分类全景、迁移路径等)。

关于用户态到内核态的桥接:C 程序一般通过 glibc/musl 封装调用 syscall;Go、Rust 等语言的运行时则直接执行 syscall 指令,绕过 libc。无论哪种方式,最终都经过同一个内核入口 entry_SYSCALL_64。

1. 概述

什么是系统调用

系统调用(syscall)是内核暴露给用户空间的编程接口。用户态程序通过 syscall 请求内核执行特权操作(如读写文件、创建进程、收发网络数据)。CPU 从用户态(ring 3)切换到内核态(ring 0),执行内核代码,完成后返回用户态。

Linux x86_64 共 335+ 个系统调用(截至 5.10),涵盖 15 个功能类别。每个系统调用标注了首次出现的内核版本。未标注版本号的系统调用在 1.0 或更早版本中就已存在。

#分类数量核心调用举例
1文件与目录操作~90open, read, write, close, stat, rename
2进程与线程管理~60fork, clone3, execve, exit, wait4, prctl
3内存管理~25mmap, munmap, mprotect, brk, madvise
4网络套接字~22socket, bind, connect, accept, sendmsg
5信号与定时器~28rt_sigaction, kill, timerfd_create
6用户与权限~38setuid, capget, setrlimit, seccomp
7时间与时钟~14clock_gettime, nanosleep, gettimeofday
8IPC~21pipe, shmget, semop, mq_open, futex
9文件系统与挂载~11mount, umount2, pivot_root, fsopen
10I/O 多路复用~18epoll_create1, epoll_ctl, poll, select
11异步 I/O / io_uring~9io_uring_setup, io_submit, io_getevents
12系统控制与信息~26syslog, uname, bpf, getrandom, ioctl
13内核模块与密钥~6init_module, keyctl, request_key
14架构专属~42arch_prctl, riscv_flush_icache...
15已废弃/已移除~20+_sysctl, create_module, nfsservctl...

2. 系统调用执行流程

Diagram

3. vDSO 快速路径 vs 慢速路径

Diagram
vDSO 原理:内核将一段只读代码和数据页映射到每个进程的地址空间。调用频率极高的 clock_gettime 和 gettimeofday 完全在用户态完成(读 TSC 寄存器 + 内核维护的校准数据),避免上下文切换开销。

4. 调用约定

4.1 x86-64

项目约定
指令syscall
调用号存于 rax
第1参数rdi
第2参数rsi
第3参数rdx
第4参数r10(非 rcx,因为 syscall 会破坏 rcx)
第5参数r8
第6参数r9
返回值rax(0 ~ -4095 表示错误,errno = -rax)
被破坏的寄存器rcx, r11
; 示例: read(0, buf, 128)
mov rax, 0         ; syscall 号: read
mov rdi, 0         ; fd = 0 (stdin)
mov rsi, buf       ; 缓冲区地址
mov rdx, 128       ; 长度
syscall
cmp rax, -4095
ja  error_handler  ; 如果 rax > -4095,说明是负的 errno
errno 判断:内核返回负的 errno 值(-1 到 -4095),glibc 将其转为 -1 并设置 errno。直接 syscall 时需自行处理:若 rax 在 -4095 到 -1 之间,则调用失败,errno = -rax。

4.2 其他架构对比

架构指令调用号寄存器参数寄存器(按顺序)返回
x86-64syscallraxrdi, rsi, rdx, r10, r8, r9rax
i386 (32-bit)int 0x80eaxebx, ecx, edx, esi, edi, ebpeax
arm64svc #0x8x0, x1, x2, x3, x4, x5x0
RISCV64ecalla7a0, a1, a2, a3, a4, a5a0

5. 系统调用分类全景图

Diagram

6. 文件 I/O

6.1 核心调用 (x86-64 编号)

syscall号签名说明
read0read(fd, buf, count)从 fd 读取 count 字节到 buf。返回实际读取字节数;0 表示 EOF
write1write(fd, buf, count)将 buf 中 count 字节写入 fd
open2open(path, flags, mode)打开文件,返回 fd。flags 如 O_RDONLY/O_WRONLY/O_CREAT 等
close3close(fd)关闭 fd
stat4stat(path, buf)获取文件元信息(大小、权限、inode 等),填入 struct stat
fstat5fstat(fd, buf)同 stat,但通过 fd 而非路径
lstat6lstat(path, buf)同 stat,但对符号链接不解引用
lseek8lseek(fd, offset, whence)移动文件读写位置。whence: SEEK_SET/SEEK_CUR/SEEK_END
pread6417pread64(fd, buf, count, offset)从指定 offset 读取,不改变 fd 的当前位置(原子操作)
pwrite6418pwrite64(fd, buf, count, offset)从指定 offset 写入,不改变 fd 当前位置
rename82rename(old, new)重命名文件。若 new 已存在则原子替换
truncate76truncate(path, length)将文件截断/扩展到 length
unlink87unlink(path)删除文件(硬链接计数 -1,为 0 时真正删除)
mkdir83mkdir(path, mode)创建目录
rmdir84rmdir(path)删除空目录
getdents64217getdents64(fd, dirp, count)读取目录项(ls 等工具用此实现)
openat257openat(dirfd, path, flags, mode)相对 dirfd 打开文件,避免 TOCTOU 竞态
readlink89readlink(path, buf, bufsiz)读取符号链接的目标路径
fsync74fsync(fd)将 fd 所有缓冲数据写入磁盘
fdatasync75fdatasync(fd)同 fsync 但仅同步数据(不同步元数据),更快
fallocate285fallocate(fd, mode, offset, len)预分配文件空间(比 lseek+write 高效)

6.2 文件 I/O 操作栈

Diagram

6.3 扩展文件操作 (Kernel 版本)

syscall版本说明
close_range5.9批量关闭文件描述符范围
copy_file_range4.5内核态文件范围拷贝,零拷贝
openat25.6openat 增强版,可扩展参数结构
statx4.11增强版文件状态查询(含出生时间等)
renameat23.15renameat 增强版(支持交换等)
preadv2 / pwritev24.6指定偏移量 + 标志的分散/集中 I/O
splice2.6.17管道间零拷贝数据传输
tee2.6.17管道数据复制(零拷贝)
vmsplice2.6.17用户态内存→管道(零拷贝)
syncfs2.6.39刷回特定文件系统
name_to_handle_at2.6.39路径→文件句柄
open_by_handle_at2.6.39文件句柄→fd

open flag 常用组合

O_RDONLY    = 0x0     // 只读
O_WRONLY    = 0x1     // 只写
O_RDWR      = 0x2     // 读写
O_CREAT     = 0x40    // 不存在则创建
O_EXCL      = 0x80    // 与 O_CREAT 联合,文件已存在则失败
O_TRUNC     = 0x200   // 打开时清空
O_APPEND    = 0x400   // 追加写
O_NONBLOCK  = 0x800   // 非阻塞
O_DIRECT    = 0x4000  // 绕过 page cache
O_CLOEXEC   = 0x80000 // exec 时自动关闭

7. 进程管理

7.1 核心调用

syscall号签名说明
fork57fork()创建子进程(复制父进程)。父返回子 pid,子返回 0
execve59execve(path, argv, envp)执行新程序,替换当前进程镜像。成功不返回
exit60exit(status)终止当前进程,不会返回
exit_group231exit_group(status)终止所有线程(glibc exit() 实际调用此)
wait461wait4(pid, wstatus, options, rusage)等待子进程状态变更,回收僵尸进程
clone56clone(fn, stack, flags, arg, ...)创建新进程/线程的底层接口
clone3435clone3(cl_args, size)clone 新版本,使用结构体传参
nanosleep35nanosleep(req, rem)让进程休眠指定时间(纳秒精度)
sched_yield24sched_yield()主动放弃 CPU
getpid39getpid()获取当前进程 PID
gettid186gettid()获取当前线程 TID
getppid110getppid()获取父进程 PID
futex202futex(uaddr, op, val, timeout, uaddr2, val3)快速用户态互斥锁(pthread_mutex 底层实现)
rseq334rseq(rseq, rseq_len, flags, sig)Restartable Sequences(Go runtime 使用)

7.2 扩展进程/线程操作

syscall版本说明
execveat3.19相对目录执行程序
pidfd_open5.3打开进程文件描述符 (pidfd)
pidfd_send_signal5.1通过 pidfd 发送信号(避免 PID 复用)
pidfd_getfd5.6通过 pidfd 获取目标进程 fd
process_vm_readv3.2跨进程读取内存
process_vm_writev3.2跨进程写入内存
process_madvise5.10对另一进程地址空间给出建议
ptrace1.0进程跟踪与调试(gdb/strace 基础)
getcpu2.6.19获取当前 CPU 和 NUMA 节点
setns3.0加入命名空间
vfork2.2轻量级 fork(共享地址空间直到 execve)

clone flags 常用值

CLONE_VM        = 0x100     // 共享地址空间(线程)
CLONE_FS        = 0x200     // 共享文件系统信息
CLONE_FILES     = 0x400     // 共享 fd 表
CLONE_SIGHAND   = 0x800     // 共享信号处理表
CLONE_THREAD    = 0x10000   // 同一线程组
CLONE_NEWNS     = 0x20000   // 新 mount namespace
CLONE_NEWUTS    = 0x4000000 // 新 UTS namespace(hostname)
CLONE_NEWIPC    = 0x8000000 // 新 IPC namespace
CLONE_NEWPID    = 0x20000000// 新 PID namespace
CLONE_NEWNET    = 0x40000000// 新 network namespace

// 创建一个新线程:
clone_flags := CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD

7.3 进程生命周期

Diagram

8. 内存管理

8.1 核心调用

syscall号签名说明
mmap9mmap(addr, len, prot, flags, fd, offset)映射文件或匿名内存到虚拟地址空间
munmap11munmap(addr, len)取消内存映射
mprotect10mprotect(addr, len, prot)修改内存区域保护属性(r/w/x)
brk12brk(addr)调整数据段边界(堆顶)。malloc 小于 128KB 时用
madvise28madvise(addr, len, advice)给内核内存使用建议(MADV_DONTNEED 等)
mremap25mremap(old_addr, old_len, new_len, flags, ...)调整已有映射的大小(可移动)
mlock149mlock(addr, len)锁定内存页,禁止换出(需要 CAP_IPC_LOCK)
mincore27mincore(addr, len, vec)检查内存页是否在 RAM 中

8.2 mmap prot 和 flags

// prot 保护标志
PROT_NONE  = 0x0    PROT_READ  = 0x1    PROT_WRITE = 0x2    PROT_EXEC  = 0x4

// flags
MAP_SHARED    = 0x01   // 映射修改共享(写入同步到文件)
MAP_PRIVATE   = 0x02   // COW 私有映射
MAP_ANONYMOUS = 0x20   // 匿名映射(分配零初始化内存)
MAP_FIXED     = 0x10   // 必须映射到指定地址
MAP_POPULATE  = 0x8000 // 预填充页表
MAP_LOCKED    = 0x2000 // 锁定映射页

malloc 的两种底层方式

方式syscall适用场景
brk12小块内存(通常 <128KB),通过移动 program break 扩展堆
mmap9大块内存(≥128KB),独立映射,释放时真正归还给内核

8.3 mmap 为核心的关系图

Diagram

8.4 其他内存管理 syscall

syscall版本说明
memfd_create3.17创建匿名内存文件(共享内存/密封)
membarrier3.17多核内存屏障同步
userfaultfd4.3用户态缺页处理
mlock24.4mlock 增强版
pkey_alloc / pkey_free4.8内存保护密钥分配/释放
pkey_mprotect4.8带保护密钥的 mprotect
migrate_pages2.6.16迁移进程页面到指定 NUMA 节点
move_pages2.6.18将页面移动到指定 NUMA 节点
mbind2.6.6设置内存范围 NUMA 绑定策略

9. 网络 Socket

9.1 核心调用

syscall号签名说明
socket41socket(family, type, protocol)创建 socket fd。family: AF_INET/AF_UNIX 等
bind49bind(sockfd, addr, addrlen)将 socket 绑定到本地地址
listen50listen(sockfd, backlog)监听 TCP 连接
accept43accept(sockfd, addr, addrlen)接受一个 TCP 连接,返回新 fd(阻塞)
accept4288accept4(sockfd, addr, addrlen, flags)同 accept 但可设置 SOCK_NONBLOCK/SOCK_CLOEXEC
connect42connect(sockfd, addr, addrlen)连接远程地址
sendto44sendto(sockfd, buf, len, flags, dest_addr, addrlen)发送数据到指定地址(UDP 常用)
recvfrom45recvfrom(sockfd, buf, len, flags, src_addr, addrlen)接收数据并获取源地址
sendmsg46sendmsg(sockfd, msg, flags)高级发送(分散/聚集 I/O、传 fd)
recvmsg47recvmsg(sockfd, msg, flags)高级接收
sendfile40sendfile(out_fd, in_fd, offset, count)零拷贝文件传输
shutdown48shutdown(sockfd, how)关闭 socket 读端/写端/双向
setsockopt54setsockopt(sockfd, level, optname, optval, optlen)设置 socket 选项
getsockopt55getsockopt(sockfd, level, optname, optval, optlen)获取 socket 选项
getsockname51getsockname(sockfd, addr, addrlen)获取 socket 本地地址
getpeername52getpeername(sockfd, addr, addrlen)获取 socket 对端地址

常用 socket 选项

SO_REUSEADDR  = 2     // 重用 TIME_WAIT 状态的地址
SO_KEEPALIVE  = 9     // TCP keepalive
SO_LINGER     = 13    // close 时的行为
SO_RCVBUF     = 8     // 接收缓冲区大小
SO_SNDBUF     = 7     // 发送缓冲区大小
TCP_NODELAY   = 1     // 禁用 Nagle 算法(低延迟)

9.2 TCP 生命周期

Diagram

9.3 批量操作

syscall版本说明
recvmmsg2.6.33批量接收多条消息
sendmmsg3.0批量发送多条消息
socketpair2.0创建套接字对(Unix 域)

10. 进程间通信

10.1 核心调用

syscall号签名说明
pipe22pipe(fds[2])创建单向管道,fds[0]读端,fds[1]写端
pipe2293pipe2(fds[2], flags)同 pipe 但支持 O_NONBLOCK/O_CLOEXEC
shmget29shmget(key, size, shmflg)创建/获取 System V 共享内存段
shmat30shmat(shmid, shmaddr, shmflg)将共享内存段映射到进程地址空间
shmdt67shmdt(shmaddr)解除共享内存映射
shmctl31shmctl(shmid, cmd, buf)共享内存段控制(IPC_RMID 删除等)
semget64semget(key, nsems, semflg)创建/获取 System V 信号量集
semop65semop(semid, sops, nsops)信号量 P/V 操作(原子)
semctl66semctl(semid, semnum, cmd, ...)信号量控制(GETVAL/SETVAL/IPC_RMID)
msgget68msgget(key, msgflg)创建/获取 System V 消息队列
msgsnd69msgsnd(msqid, msg, msgsz, msgflg)发送消息到队列
msgrcv70msgrcv(msqid, msg, msgsz, msgtyp, msgflg)从队列接收消息
IPC 方式选择:实际开发中,POSIX 共享内存 (shm_open + mmap) 和 memfd_create 比 System V 更推荐;管道适用于父子进程;UNIX domain socket 传 fd 更灵活。

10.2 POSIX 消息队列

syscall版本说明
mq_open2.6.6打开/创建 POSIX 消息队列
mq_timedsend2.6.6带超时发送消息
mq_timedreceive2.6.6带超时接收消息
mq_notify2.6.6POSIX 消息队列异步通知
mq_unlink2.6.6删除 POSIX 消息队列
mq_getsetattr2.6.6获取/设置 POSIX 消息队列属性

11. 信号处理

11.1 核心调用

syscall号签名说明
kill62kill(pid, sig)向进程发送信号。pid=0 发给进程组;pid=-1 发给所有
tkill200tkill(tid, sig)向指定线程发送信号
tgkill234tgkill(tgid, tid, sig)向指定线程组中的指定线程发送信号
rt_sigaction13rt_sigaction(sig, act, oact, sigsetsize)设置信号处理函数(取代老的 signal/sigaction)
rt_sigprocmask14rt_sigprocmask(how, set, oset, sigsetsize)阻塞/解除阻塞信号
rt_sigreturn15rt_sigreturn()从信号处理函数返回(自动调用)
sigaltstack131sigaltstack(ss, oss)设置信号处理用备用栈(处理 SIGSEGV 关键)
pause34pause()挂起进程直到收到信号

11.2 信号演进

Diagram

12. 时间相关

syscall号签名说明
clock_gettime228clock_gettime(clk_id, tp)获取高精度时间。CLOCK_REALTIME / CLOCK_MONOTONIC
gettimeofday96gettimeofday(tv, tz)获取当前时间(微秒,已过时,推荐 clock_gettime)
time201time(tloc)获取 Unix 时间戳(秒)
nanosleep35nanosleep(req, rem)高精度休眠(纳秒级)
clock_nanosleep230clock_nanosleep(clk_id, flags, req, rem)同 nanosleep 但可指定时钟源(支持绝对时间)
timerfd_create283timerfd_create(clockid, flags)创建定时器 fd(可放入 epoll 统一监听)
timerfd_settime286timerfd_settime(fd, flags, new, old)设置定时器 fd 触发时间
times—times(buf)获取进程及子进程 CPU 时间
utimensat—utimensat(dirfd, path, times, flags)纳秒精度文件时间戳设置
CLOCK_REALTIME vs CLOCK_MONOTONIC:REALTIME 受系统时间调整(NTP/手动)影响,可能倒退;MONOTONIC 从系统启动开始单调递增,适合测量时间间隔。clock_gettime + gettimeofday 走 vDSO 快速路径,零 syscall 开销。

13. epoll 多路复用

13.1 核心调用

syscall号签名说明
epoll_create1291epoll_create1(flags)创建 epoll 实例,返回 fd。flags 通常传 EPOLL_CLOEXEC
epoll_ctl233epoll_ctl(epfd, op, fd, event)添加/修改/删除监听的 fd。op: ADD / MOD / DEL
epoll_pwait281epoll_pwait(epfd, events, maxevents, timeout, sigmask)等待事件就绪,支持信号屏蔽(比 epoll_wait 更安全)

event types

EPOLLIN     = 0x001   // 可读
EPOLLOUT    = 0x004   // 可写
EPOLLERR    = 0x008   // 出错
EPOLLHUP    = 0x010   // 挂断
EPOLLRDHUP  = 0x2000  // 对端关闭(半关闭检测)
EPOLLET     = 1 << 31 // 边缘触发 (Edge Triggered)
EPOLLONESHOT= 1 << 30 // 只触发一次
边缘触发 (ET) 注意事项:必须在一次事件中循环 read/write 直到返回 EAGAIN,否则可能丢失事件。新手建议先用水平触发 (LT)。

13.2 I/O 多路复用三代进化

Diagram

13.3 其他多路复用和通知机制

syscall版本说明
inotify_init12.6.27创建 inotify 实例(文件系统事件监控)
inotify_add_watch2.6.13添加 inotify 监控项
inotify_rm_watch2.6.13移除 inotify 监控项
fanotify_init2.6.37创建文件系统通知组(比 inotify 更强大)
fanotify_mark2.6.37标记文件/目录为监控目标
eventfd / eventfd22.6.22 / 2.6.27创建事件通知 fd(轻量,比 pipe 高效)
signalfd / signalfd42.6.22 / 2.6.27通过 fd 读取信号(可 epoll)

14. io_uring

Linux 5.1+ 引入的高性能异步 I/O 框架,通过共享内存环形缓冲区 (SQ/CQ) 提交和完成 I/O 请求,避免 syscall 上下文切换开销。

syscall号签名说明
io_uring_setup425io_uring_setup(entries, params)创建 io_uring 实例,返回 fd。内核分配 SQ/CQ 共享内存
io_uring_enter426io_uring_enter(fd, to_submit, min_complete, flags, ...)提交 SQ 中的请求,并等待 at least min_complete 个完成
io_uring_register427io_uring_register(fd, opcode, arg, nr_args)注册文件或缓冲区(减少每次 I/O 的 fd 引用开销)

io_uring 架构

Diagram

传统 AIO (io_setup/io_submit/io_getevents/io_cancel/io_destroy) 仅支持 O_DIRECT 文件 I/O,io_uring 是通用替代方案。

15. 系统信息

syscall号签名说明
uname63uname(buf)获取内核名称、版本、架构等信息(uname -a 的实现)
sysinfo99sysinfo(info)获取系统统计信息(内存、负载、运行时间等)
getpid39getpid()获取当前进程 PID
gettid186gettid()获取当前线程 TID
getuid102getuid()获取用户 UID
getgid104getgid()获取组 GID
getrandom318getrandom(buf, len, flags)获取内核 CSPRNG 随机数(比 /dev/urandom 更快)
getrlimit97getrlimit(resource, rlim)获取资源限制(打开文件数、栈大小等)
setrlimit160setrlimit(resource, rlim)设置资源限制
prctl157prctl(option, arg2, arg3, arg4, arg5)进程控制(PR_SET_NAME 设置线程名、PR_SET_SECCOMP 等)
personality135personality(persona)设置进程执行域(如运行 i386 二进制时设置 PER_LINUX32)

16. 其他常用

syscall号签名说明
fcntl72fcntl(fd, cmd, ...)fd 控制操作(F_GETFL/F_SETFL/F_DUPFD 等)
dup32dup(fd)复制 fd
dup233dup2(oldfd, newfd)复制 fd 到指定编号
chdir80chdir(path)切换当前工作目录
chmod90chmod(path, mode)修改文件权限
chown92chown(path, owner, group)修改文件所有者
mount165mount(source, target, fstype, flags, data)挂载文件系统
umount2166umount2(target, flags)卸载文件系统(MNT_DETACH 延迟卸载)
pivot_root155pivot_root(new_root, put_old)切换根文件系统(容器启动关键步骤)
unshare272unshare(flags)解除共享的 namespace(容器隔离基础)
eventfd284eventfd(initval, flags)创建事件通知 fd
bpf—bpf(cmd, attr, size)BPF 字节码加载/管理(eBPF 核心入口)
ioctl—ioctl(fd, request, ...)设备通用控制操作
seccomp—seccomp(op, flags, args)安全计算模式(系统调用过滤)
kcmp3.5kcmp(pid1, pid2, type, idx1, idx2)比较两进程的内核资源

文件系统与挂载 (新 API, Kernel 5.2+)

syscall说明
fsopen打开文件系统上下文
fsconfig配置文件系统上下文
fsmount获取挂载文件描述符
fspick选择已有文件系统
move_mount移动挂载点
open_tree获取挂载树 fd

17. 废弃系统调用与迁移路径

Diagram

废弃/替换的核心规律

18. 安全与隔离

Diagram

19. IPC 机制对比

Diagram

20. sys_call_table 结构 (x86_64)

Diagram

21. 核心系统调用速查 (x86_64)

编号调用名频率一句话说明
0read核心从 fd 读数据,返回实际字节数
1write核心向 fd 写数据,大块需循环
2open核心打开/创建文件,返回 fd
3close核心关闭 fd
9mmap核心映射文件/匿名内存
41socket核心创建网络套接字
42connect核心发起 TCP 连接
49bind核心绑定地址/端口
59execve核心替换进程映像
57fork核心创建子进程
56clone核心创建进程/线程(底层)
202futex核心用户态锁的内核支撑
232epoll_wait核心等待 epoll 事件就绪
291epoll_create1核心创建 epoll 实例
233epoll_ctl核心注册/修改/删除监控 fd
228clock_gettime核心获取高精度时间 (vDSO)
425io_uring_setup核心创建 io_uring 实例
7poll核心等待多个 fd 事件
217getdents64常用读取目录项
72fcntl常用fd 属性/锁控制
281epoll_pwait常用epoll_wait + 信号掩码
319memfd_create常用创建匿名内存文件
12brk低频调整进程堆边界
135personality极冷门设置执行域 (Wine)

22. 设计哲学

Diagram

23. 附录

23.1 常用错误码

errno名称含义
1EPERM操作不允许(权限不足)
2ENOENT文件/目录不存在
4EINTR系统调用被信号中断
5EIOI/O 错误
9EBADFfd 无效
11EAGAIN非阻塞操作暂无资源(try again)
12ENOMEM内存不足
13EACCES权限拒绝
14EFAULT地址无效(bad address)
17EEXIST文件已存在
22EINVAL参数无效
24EMFILE进程 fd 达到上限(too many open files)
28ENOSPC磁盘空间不足
32EPIPE管道破裂(写入端已关闭)
105ENOBUFS内存缓冲区耗尽(网络常见)
111ECONNREFUSED连接被拒绝

23.2 常用信号

编号名称默认行为说明
1SIGHUPTerm挂断(终端关闭)
2SIGINTTerm中断(Ctrl+C)
3SIGQUITCore退出(Ctrl+\)
6SIGABRTCore异常终止(abort())
8SIGFPECore算术异常(除零等)
9SIGKILLTerm强制杀死(不可捕获/忽略)
10SIGUSR1Term用户自定义信号1
11SIGSEGVCore段错误(非法内存访问)
12SIGUSR2Term用户自定义信号2
13SIGPIPETerm管道破裂
14SIGALRMTerm定时器到期
15SIGTERMTerm终止(优雅退出)
17SIGCHLDIgnore子进程状态变更
18SIGCONTContinue继续被暂停的进程
19SIGSTOPStop暂停进程(不可捕获/忽略)
20SIGTSTPStop终端暂停(Ctrl+Z)
31SIGSYSCore非法系统调用(seccomp 触发)