gpt4 book ai didi

c - 在重启的情况下保留共享内存数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:01 25 4
gpt4 key购买 nike

我目前正在使用 shmget 和 shmat 在两个进程之间创建共享内存。当进程死亡时,共享内存仍然存在,重新启动进程意味着我们可以从之前的地方开始。但是,如果机器关闭然后再打开,我们就会丢失数据。

我想知道 shmget/shmat 中是否有一个选项或其他方法可以在进程之间创建共享内存,以便即使在重新启动的情况下也能保持数据存活。

现在我正在做这样的事情:

const char *ZoneFile = "/home/Zone.dat";'
key_t sharedKeyZone;
int sharedSpaceIdZone;

int descriptor = open(ZoneFile, O_CREAT | O_RDWR, S_IRWXU);
close(descriptor);
sharedKeyZone = ftok(ZoneFile, 1);
sharedSpaceIdZone = shmget(sharedKeyZone, 1 * sizeof(Zone_t), IPC_CREAT);
ZoneArray = (Zone_t *) shmat(sharedSpaceIdZone, NULL, 0);

Zone_t 是一种结构类型,我可以毫无问题地从我的 2 进程访问 ZoneArray[0] 中的每个数据。

现在我能想到的唯一解决方案是定期写入一个包含数据的 ini 文件以“保存”系统状态,并在重新启动时读取该文件,但如果结构如此,这将完全不灵活以后一定要进化。

编辑:按照@Wumpus Q. Wumbley 的想法,我尝试以这种方式将 mmap 与 msync 结合使用:

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

//add rt to eclipse librairies

typedef struct count {

int counter;
} count;

int main()
{
count *memory;
int fd = shm_open("MYmemory.txt", O_CREAT | O_RDWR, S_IRWXU);

if(fd == -1)
{
perror("shm_open");
return 1;
}

ftruncate(fd, sizeof(count));
memory = mmap(NULL, sizeof(count), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
printf("before %d\n", memory->counter);
memory->counter = 5;
printf("after %d\n", memory->counter);
if(msync(memory, sizeof(count),MS_SYNC)<0)
{
printf("%s","msync ERROR.");
}
else { printf("%s","msync completed successfully.");}

return 0;
}

与 shmget 和 shmat 相同的结果,重启后数据为 0。(“之前”的 printf 显示 0)

编辑 2:

这是为我做的:

    count *memory;
int fd = open(MYmemoryFile, O_CREAT | O_RDWR, S_IRWXU);

ftruncate(fd, sizeof(count));
memory = mmap(NULL, sizeof(count), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
printf("before %d\n", memory->counter);
memory->counter = 5;
printf("after %d\n", memory->counter);
if(msync(memory, sizeof(count),MS_SYNC)<0)
{
printf("%s","msync ERROR.");
}
else { printf("%s","msync completed successfully.\n");}

仍然不完美,因为在我以前的代码中的任何地方我都在使用没有指针形式的内存(例如 Zone[0].param 现在是 Zone[0]->param)但这是向前迈出的一步,感谢@Wumpus问:Wumbley。

编辑 3:如果有人稍后搜索它,这里是我修复它以使用结构的方法:

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

//add rt to eclipse librairies


const char *MYmemoryFile = "/home/memorystruct.txt";


typedef struct count
{
int counter;
int test;
} match[5];

int main()
{

int fd = open(MYmemoryFile, O_CREAT | O_RDWR, S_IRWXU);

ftruncate(fd, sizeof(match));
struct count *memory = mmap(NULL, sizeof(match), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
printf("before memory[0].counter %d\n", memory[0].counter);
printf("before memory[0].counter %d\n", memory[0].test);
printf("before memory[1].counter %d\n", memory[1].counter);
memory[0].counter = 5;
memory[0].test = 2;
memory[1].counter = 17;
printf("after memory[0].counter %d\n", memory[5].counter);
printf("after memory[1].counter %d\n", memory[1].counter);
if(msync(memory, sizeof(match),MS_SYNC)<0)
{
printf("%s","msync ERROR.");
}
else
{
printf("%s","msync completed successfully.\n");
}

return 0;
}

最佳答案

如果您使用 MAP_SHAREDmmap 一个常规文件,您实际上拥有一个 shm 段,它也是一个永久文件。磁盘上的副本将滞后于内存中的副本,但您可以调用 msync 定期刷新它。

关于c - 在重启的情况下保留共享内存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com