Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

2. Первая программа shm1.c — потребитель. После заголовочных файлов создается сегмент совместно используемой памяти (размер равен вашей структуре, описывающей совместно используемую память) с помощью вызова

shmget
с заданным битом
IPC_CREAT
.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/shm.h>

#include "shm_com.h"

int main {

 int running = 1;

 void *shared_memory = (void *)0;

 struct shared_use_st *shared_stuff;

 int shmid;

 srand((unsigned int)getpid);

 shmid = shmget((key_t)1234, sizeof(struct shared_use_st),

0666 | IPC_CREAT);

 if (shmid == -1) {

fprintf(stderr, "shmget failed\n");

exit(EXIT_FAILURE);

 }

3. Теперь

вы делаете совместно используемую память доступной программе.

 shared_memory = shmat(shmid, (void *)0, 0);

 if (shared memory == (void *)-1) {

fprintf(stderr, "shmat failed\n");

exit(EXIT_FAILURE);

 }

 printf("Memory attached at %X\n", (int)shared_memory);

4. В следующем фрагменте программы сегмент

shared_memory
присваивается переменной
shared_stuff
, из которой затем выводится любой текст, содержащийся в
some_text
. Цикл продолжает выполняться до тех пор, пока не найдена строка
end
в элементе
some_text
. Вызов функции
sleep
заставляет программу-потребителя оставаться в своей критической секции, что вынуждает поставщика ждать.

 shared_stuff = (struct shared_use_st *)shared_memory;

 shared_stuff->written_by_you = 0;

 while (running) {

if (shared_stuff->written_by_you) {

printf("You wrote: %s", shared_stuff->some_text);

sleep(rand % 4);

/* Заставляет другой процесс ждать нас! */

shared_stuff->written_by_you = 0;

if (strncmp(shared_stuff->some_text, "end", 3) == 0) {

running = 0;

}

}

 }

5. В заключение совместно используемая память отсоединяется и удаляется.

 if (shmdt(shared_memory) == -1) {

fprintf(stderr, "shmdt failed\n");

exit(EXIT_FAILURE);

 }

 if (shmctl(shmid, IPC_RMID, 0) == -1) {

fprintf(stderr, "shmctl(IPC_RMID) failed\n");

exit(EXIT_FAILURE);

 }

 exit(EXIT_SUCCESS);

}

6. Вторая

программа shm2.c — поставщик; она позволяет вводить данные для потребителей. Программа очень похожа на shm1.c и выглядит следующим образом.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/shm.h>

#include "shm_com.h"

int main {

 int running = 1;

 void *shared_memory = (void *)0;

 struct shared_use_st *shared_stuff;

 char buffer[BUFSIZ];

 int shmid;

 shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);

 if (shmid == -1) {

fprintf(stderr, "shmget failed\n");

exit(EXIT_FAILURE);

 }

 shared_memory = shmat(shmid, (void *)0, 0);

 if (shared_memory == (void *)-1) {

fprintf(stderr, "shmat failed\n");

exit(EXIT_FAILURE);

 }

 printf("Memory attached at %X\n", (int)shared_memory);

 shared_stuff = (struct shared_use_st *)shared_memory;

 while (running) {

while (shared_stuff->written_by_you == 1) {

sleep(1);

printf("waiting for client...\n");

}

printf("Enter same text: ");

fgets(buffer, BUFSIZ, stdin);

strncpy(shared_stuff->some_text, buffer, TEXT_SZ);

shared_stuff->written_by_you = 1;

if (strncmp(buffer, "end", 3) == 0) {

running = 0;

}

 }

 if (shmdt(shared_memory) == -1) {

fprintf(stderr, "shmdt failed\n");

exit(EXIT_FAILURE);

 }

 exit(EXIT_SUCCESS);

}

Когда вы выполните эти программы, то получите образец вывода, подобный следующему:

$ ./shm1 &

[1] 294

Поделиться:
Популярные книги

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Кодекс Императора VI

Сапфир Олег
6. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора VI

Тринадцатый X

NikL
10. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тринадцатый X

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4

ЖЛ 8

Шелег Дмитрий Витальевич
8. Живой лед
Фантастика:
аниме
5.60
рейтинг книги
ЖЛ 8

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22