Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/164: Рейтинг темы: голосов - 164, средняя оценка - 4.59
9 / 9 / 6
Регистрация: 16.10.2011
Сообщений: 423

Класс для работы с shared memory

01.10.2016, 17:26. Показов 33283. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, пытаюсь написать класс для работы с shared memory, создание проходит вроде как успешно, а вот получить к ней доступ по id не получается, вылетает ошибка на shmctl "no such file or directory"
shared.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <iostream>
 
class shared{
    
    shared();
    void freeShm(int id);
    void* getShmptr();
    void* getShmptr(int id);
    int createShm(int size);
    int getMemId();
    int getSize();
    
    private:
        int shmid;
        int size;
        void* shmptr;
}
shared.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <shared.h>
 
shared::shared()
{
    shmid = 0;
    size = 0;
    shmptr = NULL;
}
 
int shared::createShm(int size)
{
    shmid = shmget(IPC_PRIVATE, size, 0600 | IPC_CREAT | IPC_EXCL);
    if(!shmid)
        return -1;
    shmptr = shmat(shmid, 0, 0);
    if(!shmptr)
        return -1;
    this.size = size;
    cout << "Память успешно создана\n";
    return 1;
}
 
int shared::getMemId()
{
    return shmid;
}
 
void* shared::getshmptr()
{
    return shmptr;
}
 
void* shared::getshmptr(int id)
{
    shmid_ds buf;
    if(!shmctl(id, IPC_STAT, &buf))
    {
        cout << "shmctl error\n";
        return NULL;
    }
    shmptr = shmat(id, 0, 0);
    if(!shmptr)
    {
        cout << "shmptr error\n";
        return NULL;
    }
    size = buf.shm_segsz;
    return shmptr;
}
 
void shared::freeshm()
{
    shmctl(shmid, IPC_RMID, NULL);
    size = 0;
    shmptr = NULL;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <shared.h>
 
int main()
{
    shared shm;
    int choice;
    while(true)
    {
        cout << "Что вы хотите сделать?\n";
        cout << "1. создать и подключить shm\n";
        cout << "2. подключить shm\n";
        cout << "3. удалить shm\n";
        cout << "Размер " << shm.getSize() << " id " << shm.getMemId() << endl;
        cin >> choice;
        if(choice == 1)
        {
            cout << "Введите размер в байтах\n";
            int size;
            cin >> size;
            if(!shm.createShm(size))
                cout << "Ошибка создания shm\n";
            else
                cout << "Успешно\n";
        }
        else if (choice == 2)
        {
            int id;
            cout << "Введите id shm\n";
            cin >> id;
            if(!shm.getShmptr(id))
                cout << "Ошибка\n";
            else
                cout << "Успешно\n";
        }
        else if(choice == 3)
        {
            shm.freeShm();
        }
        else
        {
            system("clear");
            cout << "Неверное значение попробуйте еще раз\n";
        }
    }
    return 0;   
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2016, 17:26
Ответы с готовыми решениями:

Shared memory
Микроконтроллер загружает необходимую информацию в shared memory по заранее известным адресам. Как считать/получить доступ к этой инфе из...

Организовать доступ к списку из любого, независимо запущенного скрипта
В версии языка 3.8 есть возможность использовать общую память. Вот таким образом можно организовать доступ к списку из любого, независимо...

Shared memory does not exist
Доброе утро! Столкнулся с такой проблемой, Oracle 8.1, лет 20 крутится около 18 схем и начала выпадать соответствующая ошибка, хотя все...

4
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
02.10.2016, 00:13
serega006, во-первых данный исходник не компилируется, из-за многочисленных ошибок.

во-вторых функции shmctl() и shmat() возвращают -1 в случае ошибки, используйте perror() для вывода текста ошибки. Так например, для первой у Вас неверное условие проверки результата функции.
1
9 / 9 / 6
Регистрация: 16.10.2011
Сообщений: 423
02.10.2016, 01:22  [ТС]
schdub, прошу прощения, скинул старые файлы и не заметил. На perror компилятор кидал много замечаний поэтому использовал strerror, который выдал ошибку Invalid argument
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "shared.h"
#include <cstdlib>
 
int main()
{
    shared shm;
    int choice;
    while(true)
    {
        cout << "Что вы хотите сделать?\n";
        cout << "1. создать и подключить shm\n";
        cout << "2. подключить shm\n";
        cout << "3. удалить shm\n";
        cout << "Размер " << shm.getSize() << " id " << shm.getMemId() << endl;
        cin >> choice;
        if(choice == 1)
        {
            cout << "Введите размер в байтах\n";
            int size;
            cin >> size;
            if(!shm.createShm(size))
                cout << "Ошибка создания shm\n";
            else
                cout << "Успешно\n";
        }
        else if (choice == 2)
        {
            int id;
            cout << "Введите id shm\n";
            cin >> id;
            if(!shm.getShmptr(id))
                cout << "Ошибка\n";
            else
                cout << "Успешно\n";
        }
        else if(choice == 3)
        {
            shm.freeShm();
        }
        else
        {
            system("clear");
            cout << "Неверное значение попробуйте еще раз\n";
        }
    }
    return 0;   
}
shared.срр
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "shared.h"
#include <errno.h>
#include <cstring>
#include <cstdio>
 
shared::shared()
{
    shmid = 0;
    size = 0;
    shmptr = NULL;
}
 
int shared::createShm(int size)
{
    shmid = shmget(IPC_PRIVATE, size, 0600 | IPC_CREAT | IPC_EXCL);
    if(!shmid)
        return -1;
    shmptr = shmat(shmid, 0, 0);
    if(!shmptr)
        return -1;
    this->size = size;
    return 1;
}
 
int shared::getSize()
{
    return size;
}
 
int shared::getMemId()
{
    return shmid;
}
 
void* shared::getShmptr()
{
    return shmptr;
}
 
void* shared::getShmptr(int id)
{
    shmid_ds buf;
    if(!shmctl(id, IPC_STAT, &buf))
    {
        cout << strerror(errno) << endl;
        cout << "shmctl error\n";
        return NULL;
    }
    shmptr = shmat(id, 0, 0);
    if(!shmptr)
    {
        cout << "shmptr error\n";
        return NULL;
    }
    size = buf.shm_segsz;
    shmid = id;
    return shmptr;
}
 
void shared::freeShm()
{
    shmctl(shmid, IPC_RMID, NULL);
    size = 0;
    shmptr = NULL;
}
shared.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <iostream>
using namespace std;
 
class shared{
    public:
    shared();
    void freeShm();
    void* getShmptr();
    void* getShmptr(int id);
    int createShm(int size);
    int getMemId();
    int getSize();
    
    private:
        int shmid;
        int size;
        void* shmptr;
};
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
02.10.2016, 01:47
Лучший ответ Сообщение было отмечено serega006 как решение

Решение

Цитата Сообщение от serega006 Посмотреть сообщение
На perror компилятор кидал много замечаний поэтому использовал strerror
подключите #include <cstdio> и используйте perror().

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <iostream>
#include <cstdio>
 
using namespace std;
 
class shared {
    int shmid;
    int size;
    void* shmptr;
public:    
    shared() : shmid(0), size(0), shmptr(NULL) {}
    ~shared() { }
    void freeShm() {
        if (shmptr)
            shmctl(shmid, IPC_RMID, NULL);
        size = 0;
        shmid = 0;
        shmptr = NULL;
    }
    void* getShmptr() {
        return shmptr;
    }
    void* getShmptr(int id) {
        shmid_ds buf;
        if(shmctl(id, IPC_STAT, &buf) == -1) {
            perror("shmctl error");
            return NULL;
        }
        shmptr = shmat(id, 0, 0);
        if(shmptr == (void*)-1) {
            perror("shmptr");
            return NULL;
        }
        size = buf.shm_segsz;
        return shmptr;
    }
    int createShm(int size) {
        shmid = shmget(IPC_PRIVATE, size, 0600 | IPC_CREAT | IPC_EXCL);
        if(!shmid)
            return -1;
        shmptr = shmat(shmid, 0, 0);
        if(!shmptr)
            return -1;
        this->size = size;
        cout << "Память успешно создана\n";
        return 1;
    }
    int getMemId() const {
        return shmid;
    }
    int getSize() const {
        return size;
    }
};
 
int main() {
    shared shm;
    int choice;
    while (true) {
        cout << "Что вы хотите сделать?\n";
        cout << "1. создать и подключить shm\n";
        cout << "2. подключить shm\n";
        cout << "3. удалить shm\n";
        cout << "Размер " << shm.getSize() << " id " << shm.getMemId() << endl;
        cin >> choice;
        if(choice == 1) {
            cout << "Введите размер в байтах\n";
            int size;
            cin >> size;
            if (!shm.createShm(size))
                cout << "Ошибка создания shm\n";
            else
                cout << "Успешно\n";
        } else if (choice == 2) {
            int id;
            cout << "Введите id shm\n";
            cin >> id;
            if(!shm.getShmptr(id))
                cout << "Ошибка\n";
            else
                cout << "Успешно\n";
        } else if(choice == 3) {
            shm.freeShm();
        } else {
            //system("clear");
            cout << "Неверное значение попробуйте еще раз\n";
        }
    }
    return 0;   
}
1
9 / 9 / 6
Регистрация: 16.10.2011
Сообщений: 423
02.10.2016, 01:57  [ТС]
schdub, ошибка оказалась в приведении к bool,
C++
1
  if(!shmctl(id, IPC_STAT, &buf))
я думал что -1 приводится к false, оказалось, что нет. Теперь всё работает, спасибо что откликнулись.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2016, 01:57
Помогаю со студенческими работами здесь

Creating Named Shared Memory
Здравствуйте. Пытаюсь освоить работу с общей памятью двух разных программ, используя FileMapping, всё делаю как в ссылке, но в первой...

Pipe, fork, shared memory
Доброго времени суток. Помогите пожалуйста написать программу: Процесс читает с клавиатуры и пишет в пайп, его ребенок читает из этого...

Не могу разобраться с Shared memory
Доброго времени суток, возникла проблема при использовании разделяемой памяти. При написании 2 небольших программ взаимодействующих с...

Insufficient space for shared memory file
Ставлю Jira на удаленный сервер и получаю такое сообщение сразу после запуска бинарника: Java HotSpot(TM) 64-Bit Server VM warning:...

COM-объект..клиент-сервер..shared memory
передо мной поставлена задача: что то в таком стиле, весь текст не привожу... вопрос: где про приведенное ниже можно почитать? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru