perror函数和strerror函数的区别
2012-12-16 23:44
155 查看
首先简单说一下file descriptors(文件描述符):
file descriptor 0是standard input (stdin标准输入)
file descriptor 1 是 standard output (stdout标准输出)
file descriptor 2 是 standard error output(stderr标准错误输出)
perror()原型:
#include <stdio.h>
void perror(const char *msg);
它是基于errno的当前值,在标准出错上产生一条出错信息,然后返回。它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。
strerror()原型:
#include <string.h>
char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回此字符串的指针。
区别:
查看man手册,
perror是将errno对应的错误消息的字符串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是将errno对应的错误消息字符串返回,要怎样处理完全由你自己决定。通常我们选择把错误消息保存到日志文件中,即写文件,所以通常可以用fprintf(fp, "%s", strerror(errno))将错误消息打印到fp指向的文件中。其中perror中errno对应的错误消息集合跟strerror是一样的,也就是说不会漏掉某些错误。
可以通过一个程序示例下:
运行测试如下:
file descriptor 0是standard input (stdin标准输入)
file descriptor 1 是 standard output (stdout标准输出)
file descriptor 2 是 standard error output(stderr标准错误输出)
perror()原型:
#include <stdio.h>
void perror(const char *msg);
它是基于errno的当前值,在标准出错上产生一条出错信息,然后返回。它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。
strerror()原型:
#include <string.h>
char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回此字符串的指针。
区别:
查看man手册,
perror是将errno对应的错误消息的字符串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是将errno对应的错误消息字符串返回,要怎样处理完全由你自己决定。通常我们选择把错误消息保存到日志文件中,即写文件,所以通常可以用fprintf(fp, "%s", strerror(errno))将错误消息打印到fp指向的文件中。其中perror中errno对应的错误消息集合跟strerror是一样的,也就是说不会漏掉某些错误。
可以通过一个程序示例下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> int main(int argc,char *argv[]) { FILE * fp; if((fp = fopen(argv[1],"r"))==NULL) { perror("perror"); printf("fork error:%s\n",strerror(errno)); exit(1); } perror("perror"); printf("fork error:%s\n",strerror(errno)); return 0; }
运行测试如下:
zjf@zjf:~/work/code/procise/application/chapter_1$ ./a.out perror: Bad address fork error:Bad address zjf@zjf:~/work/code/procise/application/chapter_1$ ./a.out 2> file fork error:Invalid argument
相关文章推荐
- 存储过程和函数的区别
- 存储过程与函数的区别
- 百度面试题:宏的概念,与函数的区别,优缺点的比较。
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- c++常用函数学习--------exit() 与atexit()的区别:
- linux下几个stat函数的区别
- 回调函数和普通函数区别(网上搜到)
- python 内建函数 str() 和 repr() 的区别
- 第七周 项目二:成员函数、友元函数、一般函数之区别(实现三个版本的求两点间距离)
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- 宏和inline函数有什么区别
- 函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)
- socket :shutdown 与 close 函数 的区别
- python中读取文件函数read()、readline()、readlines()的区别
- js中escape,encodeURI,encodeURIComponent三个函数的区别
- js中函数调用加括号和不加括号的区别
- var声明的成员变量和函数内声明的变量区别
- onAttachedToWindow () 和 onDetachedFromWindow () ; 以及更新视图的函数ondraw() 和dispatchdraw()的区别
- 学习笔记:js里调用函数时,函数名带括号与不带括号的区别
- Linux下fork()&vfork()的区别、getenv()&setenv()函数以及僵尸进程、孤儿进程讲解