相关疑难解决方法(0)

如何在Linux中为内存映射文件提供扩展写入功能?

我正在努力将一些代码从AIX移植到Linux.部分代码使用shmat()系统调用来创建新文件.当SHM_MAP在可写模式下使用时,可以将文件扩展到其原始长度之外(在我的情况下为零):

将文件映射到段时,通过访问段来引用该文件.内存分页系统自动处理物理I/O. 超出文件末尾的引用会导致文件以页面大小的增量进行扩展.文件无法扩展到下一个段边界之外.

(AIX中的"段"是256 MB的地址空间块,"页面"通常是4 KB.)

我会在Linux上做的是以下几点:

  • 保留一大块地址空间(它不必大到256 MB,这些不是很大的文件)
  • 设置页面保护位,以便在首次访问之前未触及的页面时生成段错误
  • 在页面错误时,清除"导致页面错误"位并为页面分配已提交的内存,允许导致页面错误的写入(或读取)继续
  • 关闭共享内存区域后,将修改后的页面写入文件

我知道我可以在Windows上使用VirtualProtect函数,PAGE_GUARD内存保护位和结构化异常处理程序执行此操作.Linux上相应的方法是做什么的呢?是否有更好的方法在Linux上实现这种写入扩展功能?

我已经考虑过:

  • 使用mmap()一些固定的大尺寸,但我无法分辨应用程序代码写入了多少文件
  • 分配一个大小的匿名共享内存区域,但我再也无法分辨出已写入多少区域
  • mmap() 本身似乎没有提供任何延长支持文件长度的工具

当然,我只想对应用程序代码进行最小的更改即可.

linux aix posix

5
推荐指数
1
解决办法
2991
查看次数

什么是返回类型的信号功能的实际用途

信号函数返回旧处理程序的值,但旧处理程序值可能有用的情况是什么,因为大多数地方我们不检查信号函数的返回值.

c signals

3
推荐指数
1
解决办法
106
查看次数

标签 统计

aix ×1

c ×1

linux ×1

posix ×1

signals ×1