gpt4 book ai didi

linux - shmget 先前创建的内存段失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:18 29 4
gpt4 key购买 nike

我正在尝试学习 IPC UNIX API,特别是共享内存。我已经创建了这个试图访问共享内存段或创建共享内存段的小程序。

这是我的做法:

gcc -Wall -Wextra *.c
# in one terminal
./a.out
# in another
/a.out

您可以在源代码中看到的 shared.mem 文件存在于我启动可执行文件的同一目录中。

但是,似乎我实际上从未访问过以前创建的共享内存段(错误是“没有这样的文件或目录”)。我总是创建一个新的 - 正如通过 ipcs 命令行 看到的那样,即使 IPC key 保持不变。

我做错了什么?

下面是我使用的代码,供引用。它至少可以在 Linux 上编译。

#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define exit_error(what) exit_error_func(what, __FILE__, __LINE__)

#define SHM_SIZE (64)
#define UNUSED(x) (void)(x)

void *shm_addr = NULL;

void exit_error_func(const char *what, const char *file, int line)
{
fprintf(stderr, "Error in %s at line %d: %s. Reason: %s.\n", file, line, what, strerror(errno));
exit(1);
}

void sigint_handler(int sig)
{
shmdt(shm_addr);
UNUSED(sig);
}

int main(void)
{
key_t ipc_key;
int shm_id;

if ((ipc_key = ftok("shared.mem", 1)) == -1)
exit_error("could not get IPC key");
printf("IPC key is %d\n", ipc_key);
if ((shm_id = shmget(ipc_key, SHM_SIZE, 0600)) == -1)
{
printf("could not get SHM id, trying to create one now\n");
if ((shm_id = shmget(ipc_key, SHM_SIZE, IPC_EXCL | IPC_CREAT | 0600)) == -1)
exit_error("could not create or get shared memory segment");
else
printf("created SHM id\n");
}
else
printf("got already existing SHM id\n");
printf("SHM id is %d\n", shm_id);
if ((shm_addr = shmat(shm_id, NULL, 0)) == (void *)-1)
exit_error("could not attach to segment");
signal(SIGINT, sigint_handler);
if (shmctl(shm_id, IPC_RMID, NULL) == -1)
exit_error("could not flag shared memory for deletion");
printf("SHM flagged for deletion\n");
while (1)
sleep(1);
return (0);
}

最佳答案

似乎无法shmget 标记为删除的共享内存段。因此,一旦没有进程需要 shmget 共享内存段就必须​​标记为删除。

免责声明:我不是 UNIX 专家。尽管建议的解决方案对我有用,但我仍在学习,无法保证此处提供的信息的准确性。

关于linux - shmget 先前创建的内存段失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876743/

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