Общая память Ubuntu между двумя процессами, код не работает

0

Я пишу два процесса отдельно, которые должны взаимодействовать через общую память, и я просто не могу определить, где я ошибаюсь. Первый процесс определенно создал общую память, и если он перепрограммирован, он также может считываться из разделяемой памяти.

Однако вторая программа вывода, похоже, вообще не читает. Я использую shmget в обеих программах, чтобы создать память, а затем присоединиться к ней. Я вставляю char array nameArray с помощью программы ввода, затем Output должен читать его из разделяемой памяти и cout имя.

Любая помощь приветствуется, код ниже :)

Входные данные :

#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;

main()
{
    int shmid;
    char nameArray[] = "Bill Gates";
    unsigned length = sizeof(nameArray)/sizeof(nameArray[0]);
    shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);

    if(shmid!=(-1))     /*Error checking measure to ensure shared memory creation was successful*/
    {
        char * ptr=(char *)shmat(shmid,0,0);    /*Assigns the char pointer to the start of shared memory*/

        for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
        {
            ptr=(char *)shmat(shmid,0,i);
            *ptr=nameArray[i];      /*Sends the local char array to shared memory*/
        }
    }
    else    /*Displays Error message given shared memory creation failue*/
    {
        cout << "Sorry, shared memory creation failed"
    }
}       

Вывод:

#include <iostream>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHM_KEY 982
using namespace std;

main()
{
    int shmid;
    char nameArray[20];
    shmid=shmget(SHM_KEY,256,0777|IPC_CREAT);

    if(shmid!=(-1)) /*Error checking measure to ensure shared memory creation was successful*/
    {
        char * ptr=(char *)shmat(shmid,0,0);

        for(int i=0; i<11;i++)
        {
            cout << *((char *)shmat(shmid,0,i));
        }

    }
    else{}
}       
  • 0
    Что возвращается за shmid ?
  • 0
    This cout << *((char *)shmat(shmid,0,i)); очень неправильно! Почему вы повторно подключаете сегмент памяти несколько раз? Делая char * ptr=(char *)shmat(shmid,0,0); Вы уже приложили это. Используйте ptr !
Теги:
memory
posix
shared

1 ответ

3
Лучший ответ

Код

    for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
    {
        ptr=(char *)shmat(shmid,0,i);
        *ptr=nameArray[i];      /*Sends the local char array to shared memory*/
    }

не делает то, что вы думаете, что это делает. Каждый вызов shmat привязывает весь сегмент разделяемой памяти к другому адресу с разными флагами (от 0 до length, большинство из которых бессмысленно).

Удалите вызовы shmat из цикла. Что вам действительно нужно

    for(int i=0; i<length;i++)      /*For every letter in the nameArray*/
    {
        ptr[i]=nameArray[i];      /*Sends the local char array to shared memory*/
    }

и аналогичное изменение в другой программе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню