步骤 5 / 7
返回值与 errno:失败怎么告诉程序
系统调用失败时返回 -1,具体原因放在 errno 里。
内核把结果当返回值交回:成功时是有意义的数(比如写了几个字节),失败时 C 库包装函数返回 -1。 具体原因记在全局变量 errno 里,比如 ENOENT 表示文件不存在、EACCES 表示没权限,用 perror 或 strerror 能变成人读的话。 所以写系统级代码要养成习惯:每次调用都检查返回值,就像前端每次 fetch 都要看 response.ok。
操作系统
程序不能直接碰硬件,想读写文件、上网、打印,都得通过“系统调用”这扇门请内核代办。
以 Linux(x86-64)上一个程序往终端打印一行字为例。
步骤 5 / 7
系统调用失败时返回 -1,具体原因放在 errno 里。
内核把结果当返回值交回:成功时是有意义的数(比如写了几个字节),失败时 C 库包装函数返回 -1。 具体原因记在全局变量 errno 里,比如 ENOENT 表示文件不存在、EACCES 表示没权限,用 perror 或 strerror 能变成人读的话。 所以写系统级代码要养成习惯:每次调用都检查返回值,就像前端每次 fetch 都要看 response.ok。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想打印文字,但无权直接操作硬件 |
| 用户态 | 程序发起 write 系统调用 |
| 用户态 → 内核态 | CPU 切换模式,内核接手 |
| 内核态 | 检查参数,通过后驱动硬件完成输出 |
| 内核态 | 请求不合法,返回错误码 |