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

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

Жанры

Основы программирования в 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

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

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников

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

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

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Телохранитель Генсека. Том 4

Алмазный Петр
4. Медведев
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Телохранитель Генсека. Том 4

Эволюционер из трущоб. Том 7

Панарин Антон
7. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 7

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

Я - злодейка в дораме. Сезон второй

Вострова Екатерина
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Деревенщина в Пекине

Афанасьев Семён
1. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали