C语言 <errno.h>

<errno.h> 是 C 语言标准库中的一个重要头文件,它定义了一个全局变量 errno,用于存储最近一次由系统调用或库函数引发的错误代码。通过检查和理解 errno 的值,开发者可以更准确地诊断和处理程序中的错误情况。

errno 的基本概念

错误代码

errno 是一个全局整型变量,其类型通常是 int。每当系统调用或库函数执行失败时,它们会将相应的错误代码赋值给 errno。这些错误代码通常代表特定类型的错误,例如文件不存在、权限不足等。

错误代码的范围

错误代码的范围由操作系统决定。例如,在 Linux 系统中,常见的错误代码包括:

  • EACCES:权限不够。
  • EBADF:文件描述符无效。
  • EINVAL:无效参数。
  • ENOENT:文件或目录不存在。
  • ENOMEM:内存不足。

使用 errno

为了使用 errno,你需要包含 <errno.h> 头文件。在大多数情况下,你应该在每个可能出错的操作之后检查 errno 的值,并根据需要采取适当的措施。

-- -------------------- ---- -------
-------- ---------
-------- ---------
-------- ----------

--- ------ -
    ---- ----- - ----------------------------- -----
    
    -- ----- -- ----- -
        ------------- ------- -------
        ------------- ----- ------ -------
        ------------- -------- ------ -----------------
    - ---- -
        -- ----
        -------------
    -
    
    ------ --
-

在这个例子中,我们尝试打开一个不存在的文件。如果文件打开失败,fopen 函数会返回 NULL,并且 errno 会被设置为 ENOENT。我们通过 perrorstrerror 函数来输出错误信息和错误代码。

常见错误代码及其含义

文件操作相关的错误代码

  • EACCES:没有权限访问文件或目录。
  • EBADF:文件描述符无效。
  • ENOENT:文件或目录不存在。
  • ENOTDIR:路径中的某个部分不是目录。
  • EISDIR:试图对目录进行文件操作。
  • EROFS:只读文件系统。

网络相关的错误代码

  • ECONNREFUSED:连接被拒绝。
  • ETIMEDOUT:连接超时。
  • EHOSTUNREACH:主机不可达。
  • ENETDOWN:网络未就绪。

线程相关的错误代码

  • EDEADLK:检测到死锁。
  • EINVAL:无效参数。
  • ENOMEM:内存不足。

系统资源相关的错误代码

  • ENOMEM:内存不足。
  • EMFILE:进程打开的文件描述符太多。
  • ENFILE:系统打开的文件描述符太多。

使用 strerror 函数

strerror 函数可以将 errno 的整数值转换为对应的错误消息字符串。这对于生成用户友好的错误信息非常有用。

-- -------------------- ---- -------
-------- ---------
-------- ---------
-------- ----------

--- ------ -
    ---- ----- - ----------------------------- -----

    -- ----- -- ----- -
        --------------- ------ ------- ----- ------ -----------------
    -

    ------ --
-

在这个例子中,我们使用 strerror 函数将 errno 转换为错误消息字符串,并将其打印出来。

使用 perror 函数

perror 函数是一个便捷的方式来输出错误消息,它会自动将错误代码转换为错误消息并输出到标准错误流。

-- -------------------- ---- -------
-------- ---------
-------- ---------
-------- ----------

--- ------ -
    ---- ----- - ----------------------------- -----

    -- ----- -- ----- -
        ------------- ------- -------
    -

    ------ --
-

在这个例子中,我们使用 perror 函数来输出错误消息。perror 函数会在输出中包含错误代码以及错误消息。

自定义错误处理

在某些情况下,你可能希望自定义错误处理逻辑。这可以通过检查 errno 并根据其值执行不同的操作来实现。

-- -------------------- ---- -------
-------- ---------
-------- ---------
-------- ----------

---- ---------------- ----------- -
    ------ ------------ -
        ---- -------
            -------------------
            ------
        ---- -------
            ----------------------
            ------
        --------
            ------------- ------ ------------
            ------
    -
-

--- ------ -
    ---- ----- - ----------------------------- -----

    -- ----- -- ----- -
        --- --- - ------
        ------------- ------- -------
        ------------------
    -

    ------ --
-

在这个例子中,我们定义了一个 handle_error 函数,它根据 errno 的值输出不同的错误信息。这样可以更灵活地处理不同类型的错误。

结语

<errno.h> 是 C 语言中一个强大的工具,用于处理和报告错误。通过正确使用 errno 和相关的函数,你可以编写更加健壮和用户友好的应用程序。希望这个教程能帮助你更好地理解和应用 <errno.h> 中的功能。

上一篇: C语言 <ctype.h>
下一篇: C语言 <float.h>
纠错
反馈