简单地将整数存储在共享内存段中:C

Posted

技术标签:

【中文标题】简单地将整数存储在共享内存段中:C【英文标题】:Simply storing an integer in a shared memory segment: C 【发布时间】:2011-05-09 03:41:21 【问题描述】:

我只是想在两个进程之间共享一个整数,但是内存段在程序 1 中初始化并在程序 4 中使用。这是程序 1 中的初始化:

shmid = shmget(key, sizeof(int*), 0666 | IPC_CREAT);
int *data = (int *)shmat(shmid, (void*)0,0);

在这里,我收到“从不同大小的整数转换为指针”的警告。啊。

简单,我假设,但我是 IPC 的一个大菜鸟。以及 c 中的许多其他内容......

然后我将它传递给另一个程序:

snprintf(shmarg, sizeof(shmarg), "%n", data);
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, semarg, pipe_from_p2_2, pipe_to_p5_2);

不知道如何在另一边访问它。如何在程序 4 中取回 int?

【问题讨论】:

【参考方案1】:

很确定您缺少定义 shmat() 的标头,因此编译器猜测 shmat 返回一个 int(不是指针)。

【讨论】:

【参考方案2】:

在这里,我收到“从不同大小的整数转换为指针”的警告。啊。

尝试使用 NULL 代替 (void*)0

然后我将它传递给另一个程序:

snprintf(shmarg, sizeof(shmarg), "%n", data);
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg,
                      semarg, pipe_from_p2_2, pipe_to_p5_2); 

不知道如何在另一边访问它。如何在程序 4 中取回 int?

除非共享内存区域恰好加载到另一个程序中完全相同的虚拟内存地址,否则指针本身是没有用的:您可能甚至不想尝试安排它 - 相反,让另一个程序(hw11-4) 加载共享内存段并让操作系统选择虚拟内存地址,然后简单地查看int 的地址。因此,hw11-4 需要传递相同的共享内存密钥(例如,作为命令行参数),并且它本身使用 shmget 打开并获取密钥,然后 shmat 将共享内存段映射到内存中。 ...

【讨论】:

以上是关于简单地将整数存储在共享内存段中:C的主要内容,如果未能解决你的问题,请参考以下文章

C ++多进程共享内存实现

如何设置LINUX的共享内存

如何设置LINUX的共享内存

共享内存程序中的意外输出

Linux 进程通信(共享内存区)

如何在 C 中与 Linux 一起使用共享内存