我正在检查文件是否已被修改以刷新内容... 但是,我需要一些改进:
errno==
是没用的......我该如何解决?
int is_refreshing_needed (char * path)
{
int refresh_content;
struct stat file;
stat(path, &file);
//File does not exist or Permission Denied or the file has not been modified
if( errno == 2 || errno == 13 || file.st_atime > file.st_mtime ) {
refresh_content=0;
}
else {
refresh_content=1;
}
return refresh_content;
}
答案 0 :(得分:1)
我系统上stat(2)
的手册页说明:
RETURN VALUES Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.
您必须检查对stat()
的呼叫的返回值,以确定呼叫是成功还是失败。所以:
if (stat(path, &file) != 0) {
return 0;
}
答案 1 :(得分:1)
以下是man page的错误值列表:
EACCES 拒绝搜索权限 路径中的一个目录 路径前缀。
EBADF filedes不好。
EFAULT 地址错误。
ELOOP 符号链接太多 在遍历路径时遇到。
ENAMETOOLONG 文件名太长了。
ENOENT 路径路径的一个组件 不存在,或路径是 空字符串。
ENOMEM 内存不足(即内核 存储器)。
ENOTDIR 路径的组件不是 目录。
使用此常量而不是数值。
答案 2 :(得分:0)
您应该使用常量(因为它们在stat.h中定义):
如果出现以下情况,stat()函数将失败:
EACCES Search permission is denied for a component of the path prefix. EIO An error occurred while reading from the file system. ELOOP A loop exists in symbolic links encountered during resolution of the path argument. ENAMETOOLONG The length of the path argument exceeds {PATH_MAX} or a pathname component is longer than {NAME_MAX}. ENOENT A component of path does not name an existing file or path is an empty string. ENOTDIR A component of the path prefix is not a directory. EOVERFLOW The file size in bytes or the number of blocks allocated to the file or the file serial number cannot be represented correctly in the structure pointed to by buf. The stat() function may fail if: ELOOP More than {SYMLOOP_MAX} symbolic links were encountered during resolution of the path argument. ENAMETOOLONG As a result of encountering a symbolic link in resolution of the path argument, the length of the substituted pathname string exceeded {PATH_MAX}. EOVERFLOW A value to be stored would overflow one of the members of the stat structure.
来自man -s3 stat
答案 3 :(得分:0)
当stat失败时,它返回-1;>
所以
if (stat() == -1)
// stat fail
else
// can refresh if needed
答案 4 :(得分:0)
“成功完成后,返回0。否则,返回-1并设置errno以指示错误。”
返回值包括: EOI,EOVERFLOW,EACCESS,EFAULT 还有其他人。这些错误是stat()系统调用的错误,不会随gcc / glibc版本而改变。
要访问错误信息,您需要包含
#include <errno.h>
并且您可以使用perror()函数来获取错误文本(对于perror()声明,您需要#include <stdio.h>
)。有关更多信息,请参阅“man perror”。
另外,请不要使用像2这样的数字(没有这样的文件或目录)和13(权限被拒绝)。请使用#define'ed名称使代码更易于阅读。
祝你好运!答案 5 :(得分:0)
您无需检查函数中errno
的值:只需检查stat()
的返回值并让调用者处理特定错误,例如
errno = 0;
is_refreshing_needed("foo");
if(errno) switch(errno)
{
case ENOENT:
puts("file not found");
break;
/* ... */
default:
puts("unexpected error condition");
}