Исправление 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.