C语言stderr、errno、strerror、perror

C语言stderr、errno、strerror、perror

stderr 是标准错误输出,类型为 FILE*
errno 宏是运行时最近一次的错误代码,正常运行时值为 0;
strerror() 函数用于获取 errno 错误代码对应的错误信息字符串;
perror() 函数用于打印 errno 的错误信息。是一个封装的帮助函数。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(int argc[],char *argv[]) {
	malloc(1);
	printf("errno = %d\n",errno);
	perror("perror");
	printf("strerror: %s\n",strerror(errno));

	malloc(-1);
	printf("errno = %d\n",errno);
	perror("perror");
	printf("strerror: %s\n",strerror(errno));
	return 0;
}

运行结果:

errno = 0
perror: Success
strerror: Success
errno = 12
perror: Cannot allocate memory
strerror: Cannot allocate memory
在编程中,stderr (标准错误流) 是用于报告程序运行期间的错误消息,如语法错误、运行时异常等。有时候,程序员可能希望改变stderr的内容或将其重定向到其他地方,以便于控制输出或记录日志。这通常是通过编程语言提供的I/O库函数来实现的,下面是一些常见平台上的做法: 1. **bash shell (Unix/Linux)**: - 使用 `2>&1` 可以将stderr内容同时重定向到stdout: ``` command_that_may_generate_errors 2>&1 | tee error_log.txt ``` - 或者使用 `exec 2> error_log.txt` 在进程开始时就重定向stderr。 2. **Python**: - 使用 `sys.stderr` 和 `sys.stdout`,例如: ```python with open('error_log.txt', 'w') as f: sys.stderr = f print("This is an error:", file=sys.stderr) ``` - `subprocess` 模块也有类似的功能: ```python subprocess.run(['command_with_errors'], stderr=subprocess.PIPE).stderr.decode() ``` 3. **Java**: - Java中通过`System.err.println()` 和 `PrintStream`或`BufferedWriter`来操作stderr,可以捕获错误流: ```java PrintStream oldErr = System.err; System.setErr(new PrintStream(new File("error.log"))); // ... 执行代码 ... oldErr.flush(); ``` 4. **Node.js**: - JavaScript中也可以使用 `process.stderr.write()` 方法,或者在子进程里使用 `child_process` 的 `stderr` 属性: ```javascript const { exec } = require('child_process'); exec('command_with_errors', { stdio: ['ignore', 'pipe', 'inherit'] }, (err, stdout, stderr) => { if (err) console.error(`Error: ${stderr}`); }); ``` 总之,redirecting stderr就是把程序产生的错误信息重定向到你想要的地方,这对于调试和监控程序很有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值