API 是别人软件留的窗口(你递参数、它还结果),系统调用是进操作系统内核的大门(进程从「用户态」敲内核的门),混搭(Mashup)是把多个窗口拼出新服务——现代软件一大半是「调用」出来的。
上游:6-2 的库是进程内的窗口;4-5 的函数是「调用」的最小原型;树莓派课 gpiozero 背后就是 Linux 系统调用。下游:6-16 的 GitHub 托管 API、6-19 的漏洞常出在 API 参数校验上。
一、API:软件的窗口
API(Application Programming Interface)=一套约定好的函数入口:别人把复杂功能封装好,留出「参数怎么传、结果是什么形」的合同:
- 语言级:
printf()、Python 的len()——6-2 库的窗口。 - 操作系统级:打开文件、开线程、发网络包。
- Web 级:HTTP 接口——
GET /api/weather?city=宜昌返回 JSON(6-9);大厂开放平台全走这条。 - 判断好坏:窗口打开后实现随便换——调用方只认合同不认内部(5-18 封装的服务级重演)。
二、系统调用:进内核的大门
你的程序运行在用户态(权限受限);碰硬件、管内存、收网络包这些敏感活必须请内核代劳——「申请内核服务」这个动作就是系统调用(syscall):
你的代码 → 库函数(如 printf)→ 系统调用 write → 内核写屏幕/文件
# Python 一行背后各有系统调用(Linux 下 strace 可见全链)
import os
os.getpid() # → syscall getpid(我是谁)
os.open # → syscall openat(开文件)
f = open("/dev/null", "w") # 打开文件 = 一次系统调用
f.write("x") # 写 = 又一次
f.close() # 关 = 再一次
print("三行 Python,三次以上 syscall")
- 为什么要这道门:内核是唯一的「总管家」——所有进程共享硬件,不设门禁谁都能格式化硬盘(6-19 的提权攻击打的就是这道门的漏洞)。
- 系统调用的代价:用户态↔内核态切换有开销——所以有「批量写缓冲」「0拷贝」这类优化;也解释了 6-7 里「一次 IO 很贵」。
三、混搭(Mashup):窗口拼出新大楼
把多个别人的 API 组合成自己的服务:
天气 API + 地图 API + 短信 API → 「暴雨自动给小区业主发短信」服务
你的代码一行领域逻辑,八成能力来自窗口。2010 年代地图+房产+公交的混搭潮是它的高光;今天的「API 经济」里,一个 App 背后动辄几十个第三方 API——生态位思维:不做每个轮子,做组合的那个。
动手 Demo:调一次 Web API,亲手体验「窗口合同」
# 不用任何第三方库,标准库 urllib 调公共 API
from urllib.request import urlopen
import json
resp = urlopen("https://api.github.com/repos/python/cpython") # GitHub 开放 API
data = json.loads(resp.read().decode())
for key in ("full_name", "stargazers_count", "forks_count", "language"):
print(f"{key:>16}: {data[key]}")
看到什么算成功:打印出 CPython 仓库的星数(约 6 万+)、fork 数等实时数据——零安装、一个 URL 拿到 GitHub 的功能。
读结果:你没有 GitHub 的代码,只有它的 API 合同;GitHub 后台怎么存仓库(6-16)、怎么扛流量与你无关——API 的本质是能力的出租,不是代码的共享。
30 秒实验
Linux/树莓派上跑 strace -c python3 -c "print(1)"(Windows 换 Process Monitor 看文件/注册表访问)——输出里 openat/mmap/write 成百上千次:一个 hello world 背后是几百次系统调用。「程序直接跑在裸机上」是错觉,所有程序都活在内核的管家服务里。
常见误区
- 「API 就是网络接口」——API 是「调用约定」的总称;函数签名、库头文件、HTTP 接口都是 API,Web API 只是其中一类。
- 「系统调用和我写的业务代码没关系」——每次读文件、打日志、查时间都在穿越这道门;性能分析(5-8)常在此破案。
- 「API 免费公开就能随便调」——合同有条款:限流(每分钟几次)、认证(Key)、商用授权;违反轻则封 Key 重则吃官司(接 6-17 许可协议)。
自测三问(点击展开)
1. **用户态和内核态为什么要分开?** 答:硬件是全体进程共享的,敏感操作必须经内核把关——否则谁都能破坏系统。 2. **API 合同里最关键的是什么?** 答:参数怎么传、结果什么形、错误怎么报——实现可以换,合同不能变。 3. **混搭服务的核心能力是什么?** 答:组合——把多个现成 API 拼成新服务,自己只写领域逻辑。- ☑ 6-15 完成 —— 窗口、大门与拼装:API/syscall/Mashup
- ☐ 下一节 6-16 Git、GitHub、Subversion
相关笔记
- 库与框架 —— 进程内窗口的形态
- 树莓派 7-1 · GPIO —— gpiozero 底下的系统调用链
- ⌨️ 编程原理 · 索引 —— 全课路线图