系统调用与库函数作用

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