1.本质区别
| 类型 |
作用 |
执行环境 |
开销 |
| 系统调用 |
用户程序访问内核服务的唯一入口 |
用户态→内核态切换 |
高(特权切换) |
| 库函数 |
对系统调用的封装和增强 |
纯用户态执行 |
低 |
2.调用关系图
应用程序代码
│
▼
printf("hello") ← 库函数(有缓冲、格式化)
fopen("file.txt") ← 库函数(缓冲I/O)
│
▼
glibc/C标准库内部实现
│
▼
write(fd, buf, n) ← 库函数最终调用系统调用
open(path, flags) ← 库函数最终调用系统调用
│
▼
内核trap指令 → 系统调用表 → 内核处理函数
3.核心系统调用分类
| 类别 |
关键系统调用 |
功能 |
| 文件I/O |
open/read/write/lseek/close |
无缓冲直接I/O |
| 进程管理 |
fork/exec/waitpid/exit |
创建、替换、等待进程 |
| 信号 |
signal/sigaction/kill |
异步事件通知 |
| 目录 |
opendir/readdir/closedir |
目录遍历 |
4.核心库函数分类
| 类别 |
关键库函数 |
特点 |
| stdio |
fopen/fread/fwrite/fgets/fprintf |
缓冲I/O,性能更好 |
| string |
strcpy/strlen/strcmp/memcpy |
字符串/内存操作 |
| stdlib |
malloc/free/calloc/realloc |
动态内存管理 |
| time |
time/localtime/strftime |
时间处理 |
5.选择原则
需要精确控制? → 系统调用
│
├─ 是 → fork/exec/wait/signal
│
└─ 否 → 库函数
│
├─ 普通文件读写 → fgets/fprintf
├─ 格式化输出 → printf
└─ 字符串/内存 → strcpy/malloc