【发布时间】:2019-05-21 15:12:46
【问题描述】:
我正在从事一个项目,该项目处理影响相同数据的多个进程和线程。我有一行代码可能导致分段错误,因为可以从任何地方更新数据。 对于那条特定的行,如果它导致分段错误,我想以某种方式处理它而不是让程序崩溃。 如果前一个导致分段错误,我可以简单地更新内存位置。 有没有办法做到这一点?
更新(我的案例的简短摘要):
我想要非常快速地访问文件。 为此,我调用 mmap(2) 将该文件映射到所有访问它的进程中。我写入文件的数据采用特定数据结构的形式,并且会消耗大量内存。因此,如果出现我映射的大小不够的情况,我需要增加文件大小并使用新大小再次 mmap(2) 该文件。为了增加大小,我调用了 ftruncate(2)。 ftruncate(2) 可能会被任何进程调用,因此它最终可能会缩小文件。所以我需要检查我正在访问的内存是否不会导致段错误。 我正在使用 macOS。
【问题讨论】:
-
你可以做到:stackoverflow.com/questions/2663456/… 但那将是一个非常糟糕的设计。
-
这种做法是错误的。您需要避免段错误。一旦你得到它,通常为时已晚。 Segfault 粗略的意思是:你的程序中某处存在错误,事情变得一团糟。
-
我建议使用相同的数据库,例如
sqlite -
@AndrewHenle ,它在 macOS 上不可用。很抱歉在我的问题中没有提到它。我会马上更新的。
-
SysV 共享内存的另一个问题是它不支持调整共享内存对象的大小。大多数非 SysV 系统(包括 OSX,我相信)无论如何都会用映射文件模拟 SysV 共享内存。在 tmpfs(内存)文件系统上使用 mmap 几乎是最快的。
标签: c segmentation-fault signals