如何创建一个新进程并使用共享内存与之通信
Posted
技术标签:
【中文标题】如何创建一个新进程并使用共享内存与之通信【英文标题】:How to create a new process and communicate with that using shared memory 【发布时间】:2011-08-24 18:14:21 【问题描述】:您好,我正在尝试创建一个应用程序1,它接受输入数据“hello world”。我正在使用 system() 创建一个新进程,并且我想使用共享内存(进程间通信)访问此进程中 application1 的数据。我试图运行这个程序,但无法获得输出“hello world”。如何将 application1 和 process1 中的共享内存附加到相同的地址位置。 请帮我解决这个问题。
Application1.c
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main ()
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
/* Allocate a shared memory segment. */
segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
shared_memory = (char*) shmat (segment_id, 0, 0);
printf ("shared memory attached at address %p\n", shared_memory);
/* Determine the segment’s size. */
shmctl (segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf ("segment size: %d\n", segment_size);
/* Write a string to the shared memory segment. */
sprintf (shared_memory, "Hello, world.");
/* Detach the shared memory segment. */
system("./process1");
shmdt (shared_memory);
shmctl (segment_id, IPC_RMID, 0);
return 0;
process1.c
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main ()
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
/* Allocate a shared memory segment. */
segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
shared_memory = (char*) shmat (segment_id, 0, 0);
printf ("shared memory2 attached at address %p\n", shared_memory);
printf ("%s\n", shared_memory);
/* Detach the shared memory segment. */
shmdt (shared_memory);
return 0;
输出:
shared memory attached at address 0x7f616e4f2000
segment size: 25600
shared memory22 attached at address 0x7f8746d17000
输出未打印共享内存中的数据。我希望输出打印“hello, world”。
谢谢
【问题讨论】:
为什么要使用共享内存作为IPC。这真是一项艰巨的工作。替代方案要容易几个数量级。 哦,真的。这是我第一次在 IPC 上做项目,我必须涵盖所有 IPC,这是我的 TL 分配给我的工作。 @DavidHeffernan 替代品?管道、fifo、套接字? 【参考方案1】:有几点:
1) shmget 的第一个参数是键。您在两个进程中都使用 IPC_PRIVATE,这意味着它将在两个进程中分配一个“新”的共享内存。您要做的是做出安排,使两个进程使用相同的密钥,而不是 IPC_PRIVATE 密钥。
2) 两个进程中的 shared_memory 指针不需要是相同的值才能工作。是的,内存是共享的,但这并不意味着指针将具有相同的值。共享内存可以映射到每个进程的不同内存位置。
【讨论】:
如何初始化 shm_key。 int shm_key = 10,我可以用 shm_key 替换 IPC_PRIVATE。这是正确的方法吗? 你可以这样做。 IPC_CREAT |如果该密钥已在使用中,IPC_EXCL 将导致 shmget 失败。您应该从 process1.c 中删除 IPC_EXCL。 linux.die.net/man/2/shmget 另外,这个数字对你的整个机器来说是全局的,所以你机器上的其他东西可能已经在使用 shm_key = 10。因此你需要处理 shmget 失败(如果它返回 -1)。 我已将其初始化为 key_t shm_key,并将 IPC_PRIVATE 替换为 shm_key。我还删除了 IPC_CREATE |来自标志的 IPC_EXCL。然后程序工作了。现在它将输出打印为“hello, world”。谢谢埃里克。 @Erik 我遇到了同样的问题,如何确定唯一密钥并与不相关的进程共享。使用创建者的 pid 通常是一个好主意,但如何与其他进程共享它是令人困惑的。我们可以写入 tmp 文件,但我不确定这是否是个好主意。你怎么看?以上是关于如何创建一个新进程并使用共享内存与之通信的主要内容,如果未能解决你的问题,请参考以下文章