LInux的系统错误(C++)

本文介绍了C++程序中如何通过errno全局变量和strerror/perror函数来检测和解析库函数调用的错误。重点讲解了errno的作用、strerror和perror的使用以及注意事项,强调了函数返回值在判断调用成功与否的重要性。
摘要由CSDN通过智能技术生成

在 C++程序中,如果调用了库函数,可以通过函数的返回值判断调用是否成功。其实,还有一个整
型的全局变量 errno,存放了函数调用过程中产生的错误代码。
如果调用库函数失败,可以通过 errno 的值来查找原因,这也是调试程序的一个重要方法。
errno 在<errno.h>中声明
配合 strerror()perror()两个库函数,可以查看出错的详细信息。

一.strerror()函数

strerror() 在<string.h>中声明,用于获取错误代码对应的详细信息。
char *strerror(int errnum); // 非线程安全。
int strerror_r(int errnum, char *buf, size_t buflen); // 线程安全。

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int ii;
for(ii=0;ii<150;ii++)
{
cout << ii << ":" << strerror(ii) << endl;
}
}
#include <iostream>
#include <cstring>
#include <cerrno>
#include <sys/stat.h>
using namespace std;
int main()
{
int iret=mkdir("/tmp/aaa",0755);
cout << "iret=" << iret << endl;
cout << errno << ":" << strerror(errno) << endl;
}

二.perror()函数

perror() 在<stdio.h>中声明,用于在控制台显示最近一次系统错误的详细信息,在实际开发中,服
务程序在后台运行,通过控制台显示错误信息意义不大。(对调试程序略有帮助)
void perror(const char *s);

三.注意事项

1)调用库函数失败不一定会设置 errno
并不是全部的库函数在调用失败时都会设置 errno 的值,以 man 手册为准(一般来说,不属于系
统调用的函数不会设置 errno,属于系统调用的函数才会设置 errno)。

2)errno 不能作为调用库函数失败的标志
errno 的值只有在库函数调用发生错误时才会被设置,当库函数调用成功时,errno 的值不会被修
改,不会主动的置为 0。
实际上,判断函数执行是否成功还得靠函数的返回值,只有在返回值是失败的情况下,才需
要关注 errno 的值。

#include <iostream>
#include <cstring> // strerror()函数需要的头文件。
#include <cerrno> // errno 全局变量的头文件。
#include <sys/stat.h> // mkdir()函数需要的头文件。
using namespace std;
int main()
{
int iret=mkdir("/tmp/aaa/bb/cc/dd",0755);
if (iret!=0)
{
cout << "iret=" << iret << endl;
cout << errno << ":" << strerror(errno) << endl;
perror("调用 mkdir(/tmp/aaa/bb/cc/dd)失败");
}
iret=mkdir("/tmp/dd",0755);
if (ireet!=0)
{
cout << "iret=" << iret << endl;
cout << errno << ":" << strerror(errno) << endl;
perror("调用 mkdir(/tmp/dd)失败");
}
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值