在调用函数然后检查errno之前需要清理errno吗?

Jac*_*255 2 c++ linux

  1. errno在调用函数之前我们需要重置为零吗?见下面的代码.现在场景是a_dest_path现有目录.但是当我执行代码时,它总是尝试mkdir但返回错误表示无法创建目录,因为它存在.在GDB中,我errn在调用之前检查o opendir()并且errno是2.并且errno在调用期间似乎没有设置为零opendir().所以我需要errno在呼叫前重置为零opendir()吗?

  2. errno可以在system()通话中更改,然后在我的else if分支中我检查结果system()但不是opendir().那么之后opendir(),我需要分配errno一个变量然后在if..elseif..else分支中检查这个变量吗?

DIR *dp = opendir(a_dest_path.c_str());
if (errno == ENOENT) {
    string mkdir_comman = "mkdir " + a_dest_path;
    system(mkdir_command.c_str());
} else if (errno == ENOTDIR) {
    printf("Destination %s exists but is not directory\n", a_dest_path.c_str());
    return k_error_not_directory;
} else if (errno == 0) {
    closedir(dp);
}
Run Code Online (Sandbox Code Playgroud)

Ded*_*tor 6

不,errno在调用函数之前无需重置,因为合同是:

opendir()fdopendir()函数返回一个指向目录流.出错,NULL返回,并errno进行适当设置.

测试返回值,只查看errno实际出错的时间!

(这realloc是一个罕见的函数示例,在特定情况下errno,如果不查看就无法将错误与成功区分开来,但如果需要消除歧义,则会清除错误.)

  • 在记录的几个特定异常中,只有在发生错误时才会更新`errno`. (4认同)
  • 你的转录并没有说任何地方,当这些功能开始工作时,错误将被重置.那么,你有什么安全措施,以前的指令没有设置errno? (2认同)