如何使用共享内存创建新进程并与之进行通信

时间:2011-08-24 18:14:22

标签: c ipc process

您好我正在尝试创建一个输入数据“hello world”的application1。我正在使用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

输出不在共享内存中打印数据。我希望输出打印“你好,世界”。

谢谢

1 个答案:

答案 0 :(得分:1)

有几件事:

1)shmget的第一个参数是键。您在两个进程中都使用IPC_PRIVATE,这意味着它将在两个进程中分配“新”共享内存。您要做的是进行安排,以便两个进程使用相同的密钥,但不使用IPC_PRIVATE密钥。​​

2)两个进程中的shared_memory指针不需要是相同的值即可。是的,内存是共享的,但这并不意味着指针具有相同的值。共享内存可以映射到每个进程中的不同内存位置。