(1) perror
头文件:stdio.h
函数原型:void perror(const char *msg);
它是基于errno的当前值,在标准错误输出上产生一条出错信息,然后返回。(不需要printf)
它先输出由msg字符串,然后是一个冒号后头接着对应于errno值的出错信息。
例: perror(“sendto”);
打印出:sendto: Permission denied
(2)strerror
头文件:string.h
函数原型:char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回错误此字符串
例:
printf(“errno is: %d\n”,errno);
printf(“errno is: %d\n”,strerror(errno));
结果:
errno is 13
Permission denied
(3)perror和strerror区别和联系:
可以看出:
- perror和strerror都是根据errno的值打印错误信息的。
- perror是将errno对应的错误消息的字符串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是将errno对应的错误消息字符串返回.你可以自己决定咋样处理字符串,比如可以存到日志,也可以直接printf出来。
//test.c文件
#include <stdio.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
printf("strerror:%s\n", strerror(errno));
}
return 0;
}
运行结果:
root@ubuntu:/nfsroot/exercise# gcc test.c -o test
root@ubuntu:/nfsroot/exercise# ls
led led.c led.c~ test test.c test.c~
root@ubuntu:/nfsroot/exercise# ./test
perror:: Bad address
strerror:Bad address
root@ubuntu:/nfsroot/exercise# ./test nofile
perror:: No such file or directory
strerror:No such file or directory