Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
} }5. В заключение совместно используемая память отсоединяется и удаляется.
if (shmdt(shared_memory) == -1) { fprintf(stderr, "shmdt failedn"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failedn"); 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 failedn"); exit(EXIT_FAILURE); } shared_memory = shmat(shmid, (void *)0, 0); if (shared_memory == (void *)-1) { fprintf(stderr, "shmat failedn"); exit(EXIT_FAILURE); } printf("Memory attached at %Xn", (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 failedn"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);}Когда вы выполните эти программы, то получите образец вывода, подобный следующему:
$ .<b>/shm1 &</b>[1] 294Memory attached at 40017000$ <b>./shm2</b>Memory attached at 40017000Enter some text: <b>hello</b>You wrote: hellowaiting for client...waiting for client...Enter some text:<b> Linux!</b>You wrote: Linux!waiting for client...waiting for client...waiting for client...Enter some text: <b>end</b>You wrote: end$Как это работает
Первая программа shm1 создает сегмент совместно используемой памяти и затем присоединяет его к своему адресному пространству. Вы накладываете структуру
shared_use_stwritten_by_youendВторая программа shm2 получает и присоединяет тот же самый сегмент совместно используемой памяти, поскольку она применяет тот же ключ 1234. Затем она просит пользователя ввести текст. Если флаг
written_by_youendОбратите внимание на то, что вы вынуждены с помощью флага
written_by_youОчереди сообщений
Теперь рассмотрим третье и последнее средство System V IPC: очереди сообщений. Во многом очереди сообщений похожи на именованные каналы, но без сложностей, сопровождающих открытие и закрытие канала. Однако применение очереди сообщений не избавляет вас от проблем, возникающих при использовании именованных каналов, например блокировки заполненных каналов.