c -何时设置errno



在C中,我知道您可以在errno.h中看到使用errno的错误,并且我有以下代码

int FS_copyFile(const char* PathFrom , const char* PathTo) {
FILE* Source;
FILE* Target;
struct stat st;
stat(PathFrom, &st);
char SourceFileData[st.st_size];
Source = fopen(PathFrom , "r");
if(Source == NULL) {
return errno;
}
Target = fopen(PathTo , "w");
if(Target == NULL) {
return errno;
}
fgets(SourceFileData, st.st_size + 1, Source); 
fputs(SourceFileData , Target);
fclose(Source);
fclose(Target);
}

但我不确定何时设置errno。假设不能写入的文件为foo.txt。打开文件进行写入或尝试写入时是否设置errno?

我试着在网上看,但我找不到任何东西,实际上说当errno设置。如果发生错误,我的代码的哪些部分将设置errno ?

标准C库中的函数规范是,文档中说它们将errno设置为已记录的errno的函数,文档中没有说明errno的函数可能将errno设置为非零,即使没有发生错误。(这是因为该函数可能会调用其他例程来完成某些工作,而这些例程可能会报告一个错误,之后父例程可能会以某种方式解决错误,因此它可以成功地完成其调用者请求的任务,但它可能会保留errno设置。)C 2018 7.5 2说:

…初始线程中的errno值在程序启动时为零(其他线程中的errno初始值为不确定值),但任何库函数都不会将其设置为零。errno的值可以被库函数调用设置为非零,无论是否有错误,前提是errno的使用在本文档的函数描述中没有记录。

标准C库中的函数以外的函数可能表现不同。例如,在macOS上,fts_read函数将清除errno以指示树遍历完成:

…如果已经返回了所有的层次结构成员,fts_read()返回NULL并设置外部变量errno为0…

打开或尝试写入文件时是否设置errno?

C标准对fopenfwrite的规范中没有提到errno,所以它们可能设置也可能不设置errno。这些例程的具体实现可能会记录它们设置了errno。例如,macOS的fopen文档指出,由于mallocopen(或同等)失败,它可能会失败并设置errno

请注意,fwrite通常是缓冲的,因此写入文件的任何失败都可能不会立即发生。如果没有由fwrite报告,则应由fflushfclose报告。

相关内容

  • 没有找到相关文章

最新更新