跳转至

FreeBSD

系统调用

  1. 进程管理(Process Management):内核需要创造和管理执行单元。
  2. 文件操作(File Operations):内核需要提供持久化存储和数据交互的抽象。“一切皆文件”哲学使得设备、管道、套接字等都能纳入此范畴。
  3. 进程间通信(Inter-Process Communication, IPC):内核需要提供隔离的进程间协作的机制。
  4. 网络通信(Networking):内核需要提供跨主机的通信能力,这通常被抽象为一种特殊的文件(套接字)。
  5. 内存管理(Memory Management):内核需要为进程分配和管理其私有的地址空间。
  6. 设备控制(Device Control):内核需要作为用户程序与硬件设备之间的仲裁者和抽象层。
  7. 系统状态与安全(System Status & Security):内核需要提供自我观察和控制的接口,并实施权限管控。

核心库 API

  1. C 标准库:可移植性。
  2. FreeBSD 系统库:与 FreeBSD 内核和系统特性紧密集成,功能强大但牺牲了部分可移植性。

C 标准库

这是符合 ISO C 标准(如 C99, C11 等)的库,提供了可移植的、与操作系统无关的核心功能。只要代码是符合标准的,理论上可以在任何支持 C 语言的平台上编译运行。

主要 API 大类:

  • 输入/输出: 提供文件和各种流(如 stdin, stdout, stderr)的操作。核心头文件是 <stdio.h>,包含 fopen, fread, fwrite, printf, scanf 等函数。
  • 字符串操作: 提供字符串处理功能,如拷贝、连接、比较、查找、分割等。核心头文件是 <string.h>,包含 strcpy, strlen, strcmp, strstr 等函数。
  • 字符处理: 提供对单个字符的分类和转换,如判断是否为数字、字母,或进行大小写转换。核心头文件是 <ctype.h>,包含 isalpha, isdigit, toupper 等函数。
  • 数学函数: 提供常见的数学计算,如三角函数、指数、对数、平方根、取整等。核心头文件是 <math.h>,包含 sin, cos, exp, log, sqrt 等函数。
  • 内存管理: 提供动态内存的分配与释放。核心头文件是 <stdlib.h>,包含 malloc, calloc, realloc, free 等函数。
  • 日期与时间: 提供获取和操作日历时间、处理器时间的功能。核心头文件是 <time.h>,包含 time, localtime, strftime, clock 等函数。
  • 实用函数: 提供一些常用功能,如随机数生成、与环境的交互、进程控制等。核心头文件是 <stdlib.h>,包含 rand, srand, getenv, system, exit 等函数。

FreeBSD 系统库

这部分是 FreeBSD 操作系统特有的接口,提供了对内核服务和底层硬件的直接访问。它们是实现系统编程(进程、信号、网络、设备等)的关键。

主要 API 大类:

  • 系统调用封装: 这是系统库最核心的部分,为内核的系统调用提供了 C 函数形式的包装。它们通常失败时返回 -1 并设置全局变量 errno

    • 文件与 I/O: 使用文件描述符进行低级 I/O 操作。核心函数如 open, read, write, close, ioctl。这比 C 标准库的 stdio 更底层、更灵活。
    • 进程控制: 管理进程的创建、执行和终止。核心函数如 fork, execve, wait, _exit
    • 进程间通信: 提供多种 IPC 机制,如管道、FIFO、System V 的共享内存、信号量和消息队列,以及 POSIX 的同类机制。
    • 信号: 用于处理异步事件。核心函数如 signal, sigaction, kill
    • 内存管理: 提供更底层的内存操作,如 mmap(内存映射文件或设备)、brk/sbrk(调整数据段大小)。
  • BSD 套接字: 用于网络通信的经典 API,是 TCP/IP 协议栈的用户态接口。

    • 核心函数包括 socket, bind, listen, accept, connect, send, recv
    • 支持多种协议族,如 AF_INET (IPv4), AF_INET6 (IPv6), AF_LOCAL (本地进程间通信)。
  • 扩展属性与 ACL: 管理文件的扩展元数据(扩展属性)和复杂的访问控制列表(ACL),提供了比传统 Unix 权限更精细的控制。

  • 系统信息与控制

    • sysctl 接口: 用于在运行时查询和设置系统内核参数(如网络配置、硬件信息)。
    • kvm 接口: 用于访问内核虚拟内存,通常用于读取内核数据结构,是开发 ps, vmstat 等工具的基础。
  • 库函数: 在系统调用之上构建的、符合特定标准(如 POSIX)的便利函数。

    • 正则表达式: 提供强大的模式匹配功能。
    • 目录操作: 如 opendir, readdir
    • 终端 I/O: 控制终端设置的 termios 系列函数。

总结对比

特性 C 标准库 FreeBSD 系统库
核心目标 可移植性、标准一致性 访问操作系统特有功能、性能与控制力
功能层级 相对高层,提供缓冲、格式化等便利 相对底层,直接操作内核提供的原语
依赖关系 不依赖特定操作系统 紧密依赖于 FreeBSD 内核的 ABI 和特性
典型应用 通用算法、数据处理、可移植应用逻辑 系统工具、守护进程、网络服务器、驱动程序

在实际编程中,一个应用程序通常会混合使用这两类 API。例如,一个网络服务器可能使用系统库的 fork 和套接字 API 来处理并发连接,同时使用 C 标准库的 stdio 来记录日志文件。