Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec19_razrab.ppt
Скачиваний:
19
Добавлен:
20.03.2015
Размер:
201.73 Кб
Скачать

Функции работы с общей памятью

Создать или открыть область памяти

int shm_open(const char *name, int oflag, mode_t mode);

Задать размер области (как файла)

ftruncate() или write()

Удалить область памяти

int shm_unlink(const char *name);

Закрыть область памяти

int close(int)

Отобразить на адресное пространство процесса

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

Удалить отображение

int munmap(void *start, size_t length);

Пример работы с общей памятью

#include <fcntl.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <unistd.h>

#include <stdio.h>

#include <sys/stat.h> int main(){

int mem_fd; char* shm;

//создаем область общей памяти

mem_fd = shm_open("/test.mem",O_RDWR|O_CREAT, S_IRWXU); shm_unlink("/test.mem");

ftruncate(mem_fd,100); //задаем размер в 100 байт

switch(fork()){

case 0: //child

//отображаем общую область пямяти в адресное пространство shm = mmap(NULL, 100, PROT_WRITE , MAP_SHARED, mem_fd, 0);

//записываем информацию в общую область памяти sprintf(shm,"MESSAGE FROM CHILD");

break;

default: //parent

sleep(1); // ждем одну секунду

//отображаем общую область пямяти в адресное пространство shm = mmap(NULL, 100, PROT_READ , MAP_SHARED, mem_fd, 0);

// читаем информацию из общей области памяти printf("Read from child=\"%s\"\n",shm); break;

}

// отсоединяем и удаляем общую область памяти close(mem_fd);

munmap(shm,100); return 0;

}

Пример выполнения

saa@cluster processes]$ gcc shm_posix.c -lrt [saa@cluster processes]$ ./a.out

Read from child="MESSAGE FROM CHILD"

Семафоры

Семафор – взаимоисключающая переменная

Есть два стандарта UNIX и POSIX

Стандарт UNIX

Семафоры создаются специальными системными вызовами

Операции

создать

down – захватить (опустить, уменьшить на 1)

up – вернуть (поднять, увеличить на 1)

удалить

Функции работы с семафорами

Создать семафор

int semget(key_t key, int nsems, int semflg);

Операции с семафорами

int semop(int semid, struct sembuf *sops, unsigned nsops);

Управление семафорами

int semctl(int semid, int semnum, int cmd, ...);

Операции с семафорами

Операция представляется в виде структуры

Struct sembuf {

unsigned short sem_num;

/* номер семафора */

short

sem_op;

/*

операция */

short

sem_flg;

/*

флаги */

}

Операция

Увеличение на sem_op (sem_op > 0)

Уменьшение на sem_op (sem_op < 0)

Пример программы работы c общей памятью и семафором

#include<fcntl.h>

#include<sys/types.h>

#include<sys/mman.h>

#include<unistd.h>

#include<stdio.h>

#include<sys/stat.h>

#include<sys/ipc.h> #include <sys/sem.h> int main(){

int mem_fd; char* shm;

int sem; //дескриптор семафора

struct sembuf up = {0,1,1}; //команда поднять семафор struct sembuf down = {0,-1,1}; //команда опустить семафор mem_fd = shm_open("/test.mem",O_RDWR|O_CREAT, S_IRWXU); shm_unlink("/test.mem");

ftruncate(mem_fd,100);

shm = mmap(NULL, 100, PROT_WRITE|PROT_READ , MAP_SHARED, mem_fd, 0);

sem=semget(IPC_PRIVATE,1,S_IRUSR|S_IWUSR|IPC_CREAT); //создаем семафор semop(sem,&down,0); //опускаем семафор

switch(fork()){

case 0: //child

sprintf(shm,"MESSAGE FROM CHILD"); semop(sem,&up,1); // разрешем читать break;

default: //parent

semop(sem,&down,1); // ждем разрешения читать printf("Read from child=\"%s\"\n",shm); semctl(sem,0,IPC_RMID,0); // удаляем семафор break;

}

close(mem_fd); munmap(shm,100); // отсоединяем и удаляем общую область памяти return 0;

}

Вопросы ?

Соседние файлы в папке Лекции