Как создать новый процесс и общаться с ним, используя общую память - PullRequest
1 голос
/ 24 августа 2011

Привет, я пытаюсь создать приложение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

Выходные данные не распечатываются в общей памяти.Я хочу, чтобы на выходе было напечатано "привет, мир".

Спасибо

1 Ответ

1 голос
/ 24 августа 2011

Пара вещей:

1) Первый аргумент shmget - это ключ.Вы используете IPC_PRIVATE в обоих процессах, что означает, что он выделит «новый» фрагмент совместно используемой памяти в обоих процессах.Вам нужно сделать так, чтобы оба процесса использовали один и тот же ключ, но не ключ IPC_PRIVATE.

2) Указатель shared_memory в обоих процессах НЕ ДОЛЖЕН иметь одинаковое значение, чтобы все работало,Да, память распределяется, но это не значит, что указатели будут иметь одинаковое значение.Совместно используемая память может отображаться в разные области памяти в каждом процессе.

...