可以无限期地访问文件映射内存

Can access to file mapped memory ever last indefinitely

是否有可能无限期地延长对内存位置的读取(以及另一个线程允许读取在任意超时后完成)?

例如,使用阻塞套接字,我们可以在使用 read 系统调用时停止进程:

fd = socket(AF_UNIX, SOCK_DGRAM, 0);
read(fd, buffer, 256);

通常我们不能 mmap 套接字,但我基本上希望在直接访问内存时发生同样的事情:

int x = *(int *)map;

我知道使内存访问时间更长的技术,例如使用 madvise 在访问内存之前将内存分页,但我正在寻找一种方法使它无限期地持续下去。

我考虑过对一个文件使用 mmap,然后 "locking" 该文件,但找不到合适的接口。 flock 系统调用似乎不能这样工作。

具体来说,我对 x86-64 架构的 FreeBSD 很感兴趣,但对于其他类 Unix 系统的答案,例如 Linux,以及其他架构也将不胜感激。

您可以使用 mprotect(..., PROT_NONE) 将包含 map 的页面标记为不可访问。当您随后尝试访问它时,会发生页面错误并引发 SIGSEGV

您可以为 SIGSEGV 安装处理程序,使用额外的 siginfo_t 参数声明。查看此结构的 si_addr 成员以检查错误地址是否匹配 map;这使您可以将对该地址的访问与代码中实际错误的其他故障区分开来(例如 NULL 取消引用)。如果是,则信号处理程序可以等到另一个线程告诉它继续。准备就绪后,从信号处理程序中用 PROT_READ(或 PROT_WRITE(视情况而定)和 return 调用 mprotect;错误指令重新启动并继续执行。

这是一个相当丑陋的 hack,我建议仔细研究一下您认为需要这样做的原因。您的问题似乎是 XY problem.