在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标准对fopen
和fwrite
的规范中没有提到errno
,所以它们可能设置也可能不设置errno
。这些例程的具体实现可能会记录它们设置了errno
。例如,macOS的fopen
文档指出,由于malloc
或open
(或同等)失败,它可能会失败并设置errno
。
请注意,fwrite
通常是缓冲的,因此写入文件的任何失败都可能不会立即发生。如果没有由fwrite
报告,则应由fflush
或fclose
报告。