我有一段代码试图映射某些文件.如果可以映射文件,则可以执行某些操作;如果不能映射文件,则可以执行其他操作.
该代码在两种情况下均有效,但是我想在不支持mmap的某些文件系统中进行一些测试.问题是我没有找到任何无法进行mmap的文件系统.
有人可以指出一些无法映射的文件系统吗?
解决方法:
您可以使用库插入来模拟不支持mmap的系统.只需获取此C文件
#include <errno.h>
#include <sys/mman.h>
void* mmap(void*, size_t, int, int, int, off_t) {
errno = ENODEV;
return NULL;
}
并将其编译为共享库.在LD_PRELOAD环境变量中命名该库的路径,它应优先于实际的mmap,从而模拟mmap总是会失败的系统.这样,您可以在没有超级用户特权的情况下测试代码,而无需创建某些文件系统,并且不必具有相应的内核模块,userland工具等.
从理论上讲,您可能会遇到无法控制的某些库始终依赖特定类型的mmap的情况.具有MAP_ANONYMOUS的映射是一个主要示例,因为它不受文件系统支持,因此不依赖于FS类型.如果由于违反mmap假设而在库中遇到任何问题而导致失败,则可能必须修改插入程序以更仔细地查看其参数,并将某些调用转发给libc实现,而拒绝其他调用本身.但是,只有在确实需要时,我才会这样做.