我有需要futimes
或futimens
功能的大型项目。不幸的是,android ndk包含文件夹的头文件中没有这样的功能。是否有解决方法(存根或使用现有函数的简单代码片段)?
futimes
可以在此处找到该函数的文档。
我有需要futimes
或futimens
功能的大型项目。不幸的是,android ndk包含文件夹的头文件中没有这样的功能。是否有解决方法(存根或使用现有函数的简单代码片段)?
futimes
可以在此处找到该函数的文档。
futimes(3)
是一个非 POSIX 函数,需要struct timeval
(秒,微秒)。POSIX 版本是futimens(3)
,它需要一个struct timespec
(秒,纳秒)。后者在仿生 libc 中可用。
更新:恐怕我有点超前了。该代码已签入 AOSP,但尚不可用。
但是...如果您查看代码,futimens(fd, times)
则实现为utimensat(fd, NULL, times, 0)
,其中utimensat()
似乎是在 NDK 中定义的 Linux 系统调用。所以你应该能够futimens()
基于系统调用提供你自己的实现。
更新:它变成了仿生但不是 NDK。以下是如何滚动自己的:
// ----- utimensat.h -----
#include <sys/stat.h>
#ifdef __cplusplus
extern "C" {
#endif
int utimensat(int dirfd, const char *pathname,
const struct timespec times[2], int flags);
int futimens(int fd, const struct timespec times[2]);
#ifdef __cplusplus
}
#endif
// ----- utimensat.c -----
#include <sys/syscall.h>
#include "utimensat.h"
int utimensat(int dirfd, const char *pathname,
const struct timespec times[2], int flags) {
return syscall(__NR_utimensat, dirfd, pathname, times, flags);
}
int futimens(int fd, const struct timespec times[2]) {
return utimensat(fd, NULL, times, 0);
}
将这些添加到您的项目中,包括 utimensat.h 标头,您应该一切顺利。用 NDK r9b 测试。
(这应该用适当的 ifdefs(例如#ifndef HAVE_UTIMENSAT
)包装,这样当 NDK 赶上时您可以禁用它。)
更新:此处更改 AOSP 。