perror函数

perror函数


perror函数与strerror函数都是跟errno有关系的函数, 而strerror函数不明白的可以去看一看, 了解一下. 现在, 主要说的是perror.

#include<stdio.h>   // 头文件
#include<stdlib.h>

void perror(const char *s); // 函数声明

  perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) .参数 s 是加上对错误的描述. 而错误的编号是放在errno 中, perror会去自动调用 errno 的错误提示. 大致有点像

void perror(char char *s)
{
    printf("%s %s", s, strerror(errno));
}

当你调用某些函数出错时, 就会自动修改errno的值. perror函数只是输出你写的提示和现在的errno所对应的错误.

就像这样打开一个不存在的文件, 就会将错误编号放在error中, 而perror就是输出上次编号的错误提示.

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <stdlib.h>

int main()
{
    open("function_dou", O_WRONLY);
     perror("function_dou don't error");

    return 0;
}

运行结果:

rpz@funct:~$ ./a.out 
function_dou don't error: No such file or directory

在这里还是想要说一下, 关于errno的数据类型, 它并不是一个 int, long, 等类型, 它是一个定义在errno.h头文件中的一个宏定义. 它可以在不同的进程和线程中分别调用, 同一时间允许有不同的值(恩? 是不是很不明白, 同一东西, 同一时间有不同的值? 是不是觉得很不可思议, 是不是我写错了, 不是!). 具体的实现, 我会总结errno. 在网上应该也能找到, 我也是在其他地方看到才知道的.

<think>好的,用户问的是关于perror函数运行后的样子,我需要详细解释这个函数的作用和输出形式。首先,得回忆一下perror的基本功能,它用于将上一个函数调用产生的错误代码转换为可读的消息。 接下来应该说明perror的参数,用户提供的字符串加上错误信息,比如perror("Error")会输出“Error: 具体错误”。需要强调参数如何影响输出格式,用户可能想知道参数是否必须,或者是否可以留空。 然后要提到errno变量,perror会读取这个全局变量来获取错误码。但可能用户不太了解errno,需要简单解释,但不要过于深入,以免偏离主题。 还要比较一下perror和其他函数,比如strerror,指出两者的区别,比如perror直接输出而strerror返回字符串。用户可能想知道在什么情况下选择哪一个。 示例代码是必须的,用户可能需要看到实际的用法。比如打开文件失败后用perror输出错误,这样他们能更直观地理解。同时要说明示例的可能输出,比如“Error opening file: No such file or directory”。 另外,需要注意perror的使用场景,通常是在系统调用或库函数返回错误后立即使用,以确保errno未被覆盖。这点可能对用户正确使用函数很重要。 用户可能有隐含的问题,比如为什么他们的程序没有显示预期的错误信息,可能因为他们没有正确使用perror或者在errno被修改后才调用。需要提醒他们及时调用perror,或者在多线程环境中注意errno的问题。 还要考虑不同操作系统或环境的差异,但一般来说perror的行为是一致的,遵循C标准。不过可以简要提到线程安全性,说明errno通常是线程局部的,但perror本身可能不是线程安全的,取决于实现。 总结时,应该分点列出关键信息,如函数作用、输出格式、参数影响、相关函数对比和使用示例,这样用户看起来清晰明了。需要确保语言简洁,避免技术术语过多,但又要准确。</think>`perror` 是 C 标准库中的一个函数(定义在 `<stdio.h>` 和 `<errno.h>` 中),用于将**最近一次发生的错误**(通过全局变量 `errno` 标识)转换为可读的错误消息,并输出到标准错误流(`stderr`)。它的典型使用场景是在系统调用或库函数失败后,帮助开发者快速定位问题。 --- ### **函数原型** ```c void perror(const char *s); ``` --- ### **运行后的表现形式** 1. **输出格式**: 调用 `perror("自定义提示信息")` 后,输出形式为: `自定义提示信息: 错误描述` 例如: ```text Error opening file: No such file or directory ``` 2. **依赖 `errno`**: `perror` 会根据当前 `errno` 的值(由之前发生的错误设置)生成对应的错误描述。例如: - `errno = EACCES` → 输出 "Permission denied" 3. **直接输出到 `stderr`**: 无需额外处理,`perror` 会直接将错误信息输出到标准错误流。 --- ### **示例代码** ```c #include <stdio.h> #include <errno.h> int main() { FILE *fp = fopen("non_existent_file.txt", "r"); if (fp == NULL) { perror("Error opening file"); return 1; } // ...其他操作 return 0; } ``` **可能的输出**: ```text Error opening file: No such file or directory ``` --- ### **关键点** 1. **参数的作用**: 传递给 `perror` 的字符串参数(如 `"Error opening file"`)会作为错误消息的前缀,帮助开发者快速定位代码中的错误位置。 2. **与 `strerror(errno)` 的区别**: - `strerror(errno)` 仅返回错误描述的字符串,不直接输出。 - `perror` 会自动附加到 `stderr`,并拼接自定义前缀和错误描述。 3. **及时调用**: 需在错误发生后立即调用 `perror`,因为后续操作可能会修改 `errno` 的值。 --- ### **适用场景** - 文件操作(`fopen`, `fread` 等失败时) - 内存分配(`malloc` 失败时) - 系统调用(如 `open`, `read`, `write` 返回错误时) --- ### **注意事项** - **多线程环境**:`errno` 是线程局部的(现代实现中),但需确保在调用 `perror` 前错误未被其他操作覆盖。 - **错误码范围**:`perror` 仅处理标准 C 和系统定义的错误码,自定义错误码需手动处理。 如果需要更灵活的错误处理,可以结合 `strerror(errno)` 自定义输出格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值