LINUXTALKS.CO

История изменений

Исправление Meyer, (текущая версия) :

Тебе точно нужна shared memory? Или можно использовать POSIX mqueue?

Читаю сейчас https://www.opennet.ru/docs/RUS/xtoolkit/x-1.html#x-1-7-3-3 и ничего толком не понимаю.

shmget - это совсем древний сисколл из эпохи UNIX. В линуксе и *BSD он реализован, но лучше использовать shm_open + mmap.

В С это делается примерно так:

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char** argv)
{
    // Путь к файлу, который будем мапить. Ну ты знаешь, в юниксе подход "все есть файл" и все такое.
    const char* filename = "/tmp/shared_memory";

    // Открываем файл
    int fd = shm_open(filename, O_RDWR, S_IRUSR | S_IWUSR);

    // Будем мапить 2 МБ
    size_t shared_memory_size = 2 * 1024 * 1024;

    // Собственно, мапим "файл" в память
    void* shared_memory_ptr = mmap(NULL, shared_memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);


    /*
     * Обращаться к памяти можно по указателю shared_memory_ptr
     */

    // Поработали? Прибираем за собой. Но делать это нужно только из одной программы, работающей с этой памятью
    munmap(shared_memory_ptr, shared_memory_size);
    shm_unlink(filename);

    return 0;
}

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

Исправление Meyer, :

Тебе точно нужна shared memory? Или можно использовать POSIX mqueue?

Читаю сейчас https://www.opennet.ru/docs/RUS/xtoolkit/x-1.html#x-1-7-3-3 и ничего толком не понимаю.

shmget - это совсем древний сисколл из эпохи UNIX. В линуксе и *BSD он реализован, но лучше использовать shm_open + mmap.

В С это делается примерно так:

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char** argv)
{
    // Путь к файлу, который будем мапить. Ну ты знаешь, в юниксе подход "все есть файл" и все такое.
    const char* filename = "/tmp/shared_memory";

    // Открываем файл
    int fd = shm_open(filename, O_RDWR, S_IRUSR | S_IWUSR);

    // Будем мапить 2 МБ
    size_t shared_memory_size = 2 * 1024 * 1024;

    // Собственно, мапим "файл" в память
    void* shared_memory_ptr = mmap(NULL, shared_memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);


    /*
     * Обращаться к памяти можно по указателю shared_memory_ptr
     */

    // Поработали? Прибираем за собой
    munmap(shared_memory_ptr, shared_memory_size);
    shm_unlink(filename);

    return 0;
}

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

Исправление Meyer, :

Тебе точно нужна shared memory? Или можно использовать POSIX mqueue?

Читаю сейчас https://www.opennet.ru/docs/RUS/xtoolkit/x-1.html#x-1-7-3-3 и ничего толком не понимаю.

shmget - это совсем древний сисколл из эпохи UNIX. В линуксе и *BSD он реализован, но лучше использовать shm_open + mmap.

В С это делается примерно так:

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char** argv)
{
    // Путь к файлу, который будем мапить
    const char* filename = "/tmp/shared_memory";

    // Открываем файл
    int fd = shm_open(filename, O_RDWR, S_IRUSR | S_IWUSR);

    // Будем мапить 2 МБ
    size_t shared_memory_size = 2 * 1024 * 1024;

    // Собственно, мапим "файл" в память
    void* shared_memory_ptr = mmap(NULL, shared_memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);


    /*
     * Обращаться к памяти можно по указателю shared_memory_ptr
     */

    // Поработали? Прибираем за собой
    munmap(shared_memory_ptr, shared_memory_size);
    shm_unlink(filename);

    return 0;
}

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

Исходная версия Meyer, :

Тебе точно нужна shared memory? Или можно использовать POSIX mqueue?

Читаю сейчас https://www.opennet.ru/docs/RUS/xtoolkit/x-1.html#x-1-7-3-3 и ничего толком не понимаю.

shmget - это совсем древний сисколл из эпохи UNIX. В линуксе и *BSD он реализован, но лучше использовать shm_open + mmap.