errno perror stderr 的关系

errnoperrorstderr是用于处理错误信息的相关概念和工具。

  1. errno是一个全局变量,用于表示最近发生的错误代码。它定义在 <errno.h> 头文件中,并由系统库函数在发生错误时设置。每个可能的错误代码都有一个唯一的整数值,可以通过errno变量来获取。在使用系统库函数之后,我们可以检查errno变量的值来确定函数是否成功执行,以及错误的具体原因。

  2. perror是一个函数,用于将当前errno的值和相应的错误消息打印到标准错误流(stderr)。它的原型定义在 <stdio.h> 头文件中。perror函数接受一个字符串作为参数,它会将这个字符串和errno的错误消息一起打印到标准错误流,以便我们可以更好地理解发生了什么错误。

  3. stderr是一个指向标准错误流的文件指针。它是标准C库定义的一个文件流,用于输出错误和诊断信息。与标准输出流(stdout)不同,标准错误流是一个独立的流,用于输出错误消息,而不会受到标准输出流的重定向影响。我们可以使用fprintf函数或直接使用stderr来将错误消息输出到标准错误流。

综上所述,errno变量用于表示最近发生的错误代码,perror函数用于将错误消息打印到标准错误流,而stderr则是标准错误流本身。我们可以使用它们配合使用,以更好地处理和输出错误信息。

当我们使用系统库函数时,可以通过errnoperrorstderr来处理和输出错误信息。以下是一个示例:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("Error");
        fprintf(stderr, "Failed to open file: %s\n", strerror(errno));
        return EXIT_FAILURE;
    }
    
    // 其他文件操作...
    
    fclose(file);
    return 0;
}

在这个示例中,我们尝试打开一个不存在的文件("nonexistent.txt")。由于文件不存在,fopen函数将返回NULL指针,并设置errno为适当的错误代码。

接下来,我们使用perror函数将错误消息打印到标准错误流。它会将字符串"Error"和错误消息一起输出,以提供更详细的错误描述。

然后,我们使用fprintf函数将错误消息输出到标准错误流。通过调用strerror(errno),我们将errno的错误代码转换为相应的错误消息字符串,然后将其与自定义的错误消息一起输出。

最后,我们返回一个适当的退出状态码,以表示程序执行失败。

在这个示例中,perrorfprintf(stderr, ...)都将错误信息输出到标准错误流,而不是标准输出流。这样可以将错误消息与正常输出分开,并确保错误信息在错误流中可见。

每个进程都有独立的虚拟地址空间, 有独立的errno,每个进程的errno互不影响

相关推荐
人工智能训练6 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
郭涤生7 小时前
第十章_信号_《UNIX环境高级编程(第三版)》_笔记
服务器·笔记·unix
QT 小鲜肉7 小时前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
额呃呃7 小时前
select详细分析
服务器
网创联盟,知识导航7 小时前
沐雨云香港大宽带云服务器 · 配置全览
服务器·阿里云·腾讯云
oMcLin7 小时前
Ubuntu 22.04 无法连接外部网络的故障排查与解决(解决 DNS 配置问题)
linux·网络·ubuntu
还不秃顶的计科生8 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
咯哦哦哦哦8 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言
fantasy5_58 小时前
Linux 动态进度条实战:从零掌握开发工具与核心原理
linux·运维·服务器
weixin_462446238 小时前
exo + tinygrad:Linux 节点设备能力自动探测(NVIDIA / AMD / CPU 安全兜底)
linux·运维·python·安全