c - 为共享内存初始化结构体中的 int

标签 c

我有一个 int 来跟踪队列中的单词,但我正在使用应该在多次执行中持续存在的共享内存。因此,我不能简单地说

int words = 0;

作为全局变量,因为每次运行程序时它都会被覆盖。我的结构目前看起来像这样

typedef struct {
  /* List of words stored in the FIFO. */
  Word list[ MAX_WORDS ];
  int words;

} FIFO;

我只需要在第一次运行时将“words”初始化为 0,之后该值应该通过共享内存保留,但我不知道如何做到这一点而不需要每次运行将其重置为 0。

任何帮助都会很棒,谢谢!

最佳答案

当您创建新的共享内存区域时,它会自动初始化为零。 Linux 上的 shmget 和 Windows 上的 CreateFileMapping 都是这种情况。在其他系统上可能是相同的,但您必须在文档中搜索。实际上,这意味着只要您实现了适当的锁定方案,您的应用程序将只能看到共享内存的 2 种状态 - 要么全零(您是第一个打开它的人),要么已经初始化(另一个实例打开了共享内存)之前的内存)。

不过,我不确定您是否真的想要共享内存。如果“应该在多个执行中持续存在”是指同时执行多个进程,那么这个答案适用。但是,如果您想运行您的应用程序,然后将其关闭,然后再次运行它并具有相同的 FIFO 可用,那么您只需将其写入某个文件或嵌入式/外部数据库即可。

关于c - 为共享内存初始化结构体中的 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751582/

相关文章:

c - 在 VS 2010 express C++ 程序结束后,我怎样才能使带有输出的控制台不会消失

C 编程 - 指针地址字节分割

c - 如何将未知数量的整数扫描到 C 中的数组中?

c - 向控制台应用程序添加帮助开关

c - 以下是我的闰年计划。它为每个输出显示闰年

c - Visual Studio 未返回正确的 C 浮点值

c++ - *(1 + &foo) 与 C/C++ 中的 *(&foo + 1) 相同吗?

c - 配置文件时间与 clock() 时间无关

c - 带有结构数组字段的 sprintf - 出现段错误

c - getrusage 子进程