2

我有需要futimesfutimens功能的大型项目。不幸的是,android ndk包含文件夹的头文件中没有这样的功能。是否有解决方法(存根或使用现有函数的简单代码片段)?

futimes可以在此处找到该函数的文档。

4

1 回答 1

7

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 。

于 2013-10-15T16:33:02.663 回答