错误处理

系统调用出错时需要正确的错误处理机制,这是编写健壮系统程序的基础。

错误返回值:Unix系统调用失败时通常返回 -1,成功时返回 0 或非负值。程序应始终检查系统调用的返回值。

errno 全局变量:当系统调用失败时,内核会设置全局变量 errno,指示具体的错误类型。每个 errno 值对应一种错误类型(如 EINTR 表示被信号中断,EACCES 表示权限不足)。

错误信息输出

  • perror(const char *s):打印自定义前缀 + 当前 errno 对应的错误描述字符串到 stderr。
  • strerror(int errnum):根据 errno 值返回对应的错误描述字符串,不直接输出。

最佳实践:每次系统调用后立即检查返回值,在错误发生时记录或处理。简单包装是常见做法——例如 CSAPP 配套的 csapp.h 头文件中提供了 Fork()Execve() 等包装函数,自动检查错误并在失败时终止程序,适合教学场景。

在生产代码中,错误处理应更精细:区分致命错误和可恢复错误,对网络、文件等操作重试(如处理 EINTR 信号中断),对内存不足等致命错误适当终止。

链接到