Профтемы студенту и преподавателю
Taketop.ru
СТУДЕНТУ И ПРЕПОДАВАТЕЛЮ
лекции по дисциплинам
Информатика и вычислительная техника :: Операционные системы и среды
Контроль и освобождение совместно используемой памяти
Функция shmctl() возвращает информацию о совместно используемом сегменте и способна модифицировать его. Первым параметром является идентификатор сегмента.Чтобы получить информацию о сегменте, укажете в качестве второго параметра константу IPC_STAT, а в третьем параметре передайте указатель на структуру shmid_ds. Чтобы удалить сегмент, передайте во втором параметре константу IPC_RMID, а в третьем параметре NULL. Сегмент удаляется, когда последний подключивший его процесс отключает сегмент. Каждый совместно используемый сегмент должен явно освобождаться с помощью функции shmctl(), чтобы случайно не был превышен системный лимит на общее число таких сегментов.  Функция exit() и exec() отключают сегменты, но не освобождают их.

Пример программы

/*Пример совместного использования памяти shm.c*/
#include<stdio.h>
#include<sys/shm.h>
#include<sys/stat.h>
int main()
{
int segment_id;
char * shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;       
/*Выделение совместно используемого сегмента. */
segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT |
IPC_EXCL | S_IRUSR | S_IWUSR);
/*Подключение сегмента.*/
shared_memory = (char*) shmat (segment_id, 0, 0);
printf ("shared memory attached at address %p\n", shared_memory);
/*Определение размера сегмента.*/
shmctl (segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf ("segment size: %d\n", segment_size);
/*Запись строки в сегмент.*/
sprintf (shared_memory, "Hello World");)
/*Отключение сегмента. */
shmdt (shared_memory);
/*Повторное подключение сегмента, но по другому адресу. */
shared_memory = (char*) shmat (segment_id, (void*) 0x5000000, 0);
printf ("shared_memory reattached at address %p\n",shared_memory);
/*Отображение строки, хранящейся в совместно используемой
памяти.*/      
printf ("%s\n", shared_memory);
/*Отключение сегмента.*/
shmdt (shared_memory);
/*Освобождение сегмента.*/
shmctl (segment_id, IPC_RMID, 0);
return 0;
}
/*Конец программы*/

Отладка.
Команда ipcs выдает информацию о взаимодействии процессов, включая сведения о совместно используемых сегментах (для этого следует задать флаг -m.). Например, в показанном ниже случае сообщается о том, что используется один такой сегмент, с номером 327681:
  ключ         shmid   владелец права   байты    nattch     состояние
0x00000000  327681    user       600      393216        0  
Если это сегмент был по ошибке забыт какой-то программой, его можно удалить с помощью команды ipcrm:       
ipcrm shm 327681
Работы, представленные на сайте http://taketop.ru, предназначено исключительно для ознакомления. Все права в отношении работ и/или содержимого работ, представленных на сайте http://taketop.ru, принадлежат их законным правообладателям. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие или полученные в связи с использованием работ и/или содержимого работ, представленных на сайте http://taketop.ru
Рейтинг@Mail.ru
Сайт управляется SiNG cms © 2010-2015