Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Shm_open.c





#include <unistd.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <fcntl.h>

#include <stdio.h>

#include <string.h>

 

#define SHARED_MEMORY_OBJECT_NAME "my_shared_memory"

#define SHARED_MEMORY_OBJECT_SIZE 50

#define SHM_CREATE 1

#define SHM_PRINT 3

#define SHM_CLOSE 4

 

void usage(const char * s) {

printf("Usage: %s <create|write|read|unlink> ['text']\n", s);

}

 

int main (int argc, char ** argv) {

int shm, len, cmd, mode = 0;

char *addr;

 

if (argc < 2) {

usage(argv[0]);

return 1;

}

 

if ((!strcmp(argv[1], "create") ||!strcmp(argv[1], "write")) && (argc == 3)) {

len = strlen(argv[2]);

len = (len<=SHARED_MEMORY_OBJECT_SIZE)?len:SHARED_MEMORY_OBJECT_SIZE;

mode = O_CREAT;

cmd = SHM_CREATE;

} else if (! strcmp(argv[1], "print")) {

cmd = SHM_PRINT;

} else if (! strcmp(argv[1], "unlink")) {

cmd = SHM_CLOSE;

} else {

usage(argv[0]);

return 1;

}

 

if ((shm = shm_open(SHARED_MEMORY_OBJECT_NAME, mode|O_RDWR, 0777)) == -1) {

perror("shm_open");

return 1;

}

 

if (cmd == SHM_CREATE) {

if (ftruncate(shm, SHARED_MEMORY_OBJECT_SIZE+1) == -1) {

perror("ftruncate");

return 1;

}

}

 

addr = mmap(0, SHARED_MEMORY_OBJECT_SIZE+1, PROT_WRITE|PROT_READ, MAP_SHARED, shm, 0);

if (addr == (char*)-1) {

perror("mmap");

return 1;

}

 

switch (cmd) {

case SHM_CREATE:

memcpy(addr, argv[2], len);

addr[len] = '\0';

printf("Shared memory filled in. You may run '%s print' to see value.\n", argv[0]);

break;

case SHM_PRINT:

printf("Got from shared memory: %s\n", addr);

break;

}

 

munmap(addr, SHARED_MEMORY_OBJECT_SIZE);

close(shm);

 

if (cmd == SHM_CLOSE) {

shm_unlink(SHARED_MEMORY_OBJECT_NAME);

}

 

return 0;

}

[скачать]

После создания объекта памяти мы установили нужный нам размер shared memory вызовом ftruncate(). Затем мы получили доступ к разделяемой памяти при помощи mmap(). (Вообще говоря, даже с помощью самого вызова mmap() можно создать разделяемую память. Но отличие вызова shm_open() в том, что память будет оставаться выделенной до момента удаления или перезагрузки компьютера.)

Компилировать код на этот раз нужно с опцией -lrt:

$ gcc -o shm_open -lrt shm_open.c


Смотрим что получилось:

$./shm_open create 'Hello, my shared memory!'

Shared memory filled in. You may run './shm_open print' to see value.

$./shm_open print

Got from shared memory: Hello, my shared memory!

$./shm_open create 'Hello!'

Shared memory filled in. You may run './shm_open print' to see value.

$./shm_open print

Got from shared memory: Hello!

$./shm_open close

$./shm_open print

shm_open: No such file or directory


Аргумент «create» в нашей программе мы используем как для создания разделенной памяти, так и для изменения ее содержимого.

Зная имя объекта памяти, мы можем менять содержимое разделяемой памяти. Но стоит нам вызвать shm_unlink(), как память перестает быть нам доступна и shm_open() без параметра O_CREATE возвращает ошибку «No such file or directory».







Date: 2015-07-01; view: 422; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию