-->

Основы программирования в Linux

На нашем литературном портале можно бесплатно читать книгу Основы программирования в Linux, Мэтью Нейл-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Основы программирования в Linux
Название: Основы программирования в Linux
Дата добавления: 16 январь 2020
Количество просмотров: 669
Читать онлайн

Основы программирования в Linux читать книгу онлайн

Основы программирования в Linux - читать бесплатно онлайн , автор Мэтью Нейл
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

shmctl

Функции управления совместно используемой памятью (к счастью) гораздо проще аналогичных, но более сложных функций для семафоров:

<b>int shmctl(int shm_id, int command, struct shmid_ds *buf);</b>

У структуры типа

shmid_ds
есть, как минимум, следующие элементы:

<b>struct shmid_ds {</b>

<b> uid_t shm_perm.uid;</b>

<b> uid_t shm_perm.gid;</b>

<b> mode_t shm_perm.mode;</b>

<b>}</b>

Первый параметр

shm_id
— идентификатор, возвращаемый функцией
shmget
.

Второй параметр

command
содержит предпринимаемое действие. Он может принимать три значения, перечисленные в табл. 14.2.

Таблица 14.2

Значение Описание
IPC_STAT
Задаёт данные в структуре
shmid_ds
, отображающие значения, связанные с совместно используемой памятью
IPC_SET
Устанавливает значения, связанные с совместно используемой памятью в соответствии с данными из структуры типа
shmid_ds
, если у процесса есть право на это действие
IPC_RMID
Удаляет сегмент совместно используемой памяти

Третий параметр

buf
— указатель на структуру, содержащую режимы и права доступа для совместно используемой памяти.

В случае успеха возвращает 0, в случае ошибки — -1. В стандарте X/Open не описано, что произойдет, если вы попытаетесь удалить присоединенный к процессу сегмент совместно используемой памяти. Обычно присоединенный, но удаленный сегмент совместно используемой памяти продолжает функционировать до тех пор, пока не будет отсоединен от последнего процесса. Но поскольку это поведение не задано в стандарте, на него лучше не рассчитывать.

Выполните упражнение 14.2.

Упражнение 14.2. Совместно используемая память

После знакомства с функциями совместно используемой памяти можно написать программу для их использования. В данном упражнении вы напишите пару программ: shm1.c и shm2.c. Первая (потребитель) создаст сегмент разделяемой памяти и затем отобразит любые данные, записанные в него. Вторая (поставщик) присоединит существующий сегмент совместно используемой памяти и позволит вам ввести данные в этот сегмент.

1. Сначала создайте общий заголовочный файл для описания совместно используемой памяти, которую вы хотите предоставить. Назовите его shm_com.h.

#define TEXT_SZ 2048

struct shared_use_st {

 int written_by_you;

 char some_text[TEXT_SZ];

};

В файле определена структура, которая будет применяться в обеих программах: потребителе и поставщике. Вы используете флаг

written_by_you
типа
int
для того, чтобы сообщить потребителю о том, что данные записаны в оставшуюся часть структуры, и произвольно решаете, что необходимо передать до 2 Кбайт текста.

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

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

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;string.h&gt;

#include &lt;sys/shm.h&gt;

#include &quot;shm_com.h&quot;

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, &quot;shmget failedn&quot;);

  exit(EXIT_FAILURE);

 }

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

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

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

  fprintf(stderr, &quot;shmat failedn&quot;);

  exit(EXIT_FAILURE);

 }

 printf(&quot;Memory attached at %Xn&quot;, (int)shared_memory);

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

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

 shared_stuff = (struct shared_use_st *)shared_memory;

 shared_stuff-&gt;written_by_you = 0;

 while (running) {

  if (shared_stuff-&gt;written_by_you) {

   printf(&quot;You wrote: %s&quot;, shared_stuff-&gt;some_text);

   sleep(rand() % 4);

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

   shared_stuff-&gt;written_by_you = 0;

   if (strncmp(shared_stuff-&gt;some_text, &quot;end&quot;, 3) == 0) {

    running = 0;

   }

Перейти на страницу:
Комментариев (0)
название