Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
На рис. 13.3 показан результат вызова pipe
, на рис. 13.4 — результат вызова fork
, а на рис. 13.5 представлена программа, когда она готова к передаче данных.

Рис. 13.3

Рис. 13.4

Рис. 13.5
Именованные каналы: FIFO
До сих пор вы могли передавать данные только между связанными программами, т.е. программами, которые стартовали из общего процесса-предка. Часто это очень неудобно, хотелось бы, чтобы и у несвязанных процессов была возможность обмениваться данными.
Вы можете сделать это с помощью каналов FIFO, часто называемых именованными каналами. Именованный канал — это файл специального типа (помните, что в ОС Linux все, что угодно, — файл!), существующий в виде имени в файловой системе, но ведущий себя как неименованные каналы, которые вы уже встречали.
Вы можете создавать именованные каналы из командной строки и внутри программы. С давних времен программой создания их в командной строке была команда mknod
:
$ mknod имя_файла p
Однако команды mknod
нет в списке команд X/Open, поэтому она включена не во все UNIX-подобные системы. Предпочтительнее применять в командной строке
$ mkfifo имя_файла
У некоторых более старых версий UNIX была только команда mknod
. В стандарте X/Open issue 4 Version 2 есть вызов функции mknod
, но не программа командной строки. ОС Linux, как всегда настроенная дружелюбно, предлагает оба варианта: mknod
и mkfifo
.
Внутри программы можете применять два разных вызова:
#include
#include
int mkfifo(const char *filename, mode_t mode);
int mknod(const char* filename, mode_t mode | S_IFIFO, (dev_t)0);
Помимо команды mknod
вы можете использовать функцию mknod
для создания файлов специальных типов. Единственный переносимый вариант применения этой функции, создающий именованный канал, — использование значения 0 типа dev_t
и объединений с помощью операции or режима доступа к файлу и S_IFIFO
. В примерах мы будем применять более простую функцию mkfifo
.
Итак, выполните упражнение 13.9.
Далее приведен исходный текст примера fifo1.c.
#include
#include
#include
#include
#include
int main() {
int res = mkfifo("/tmp/my_fifo", 0777);
if (res == 0) printf ("FIFO created\n");
exit(EXIT_SUCCESS);
}
Вы можете создать канал и заглянуть в него:
$ ./fifo1
FIFO created
$ ls -lF /tmp/my_fifo
prwxr-xr-x 1 rick users 0 2007-06-16 17:18 /tmp/my_fifo|
Обратите внимание на то, что первый символ вывода — р
, обозначающий канал. Символ |
в конце добавлен опцией -F
команды ls
и тоже обозначает канал.
Как это работает
Программа применяет функцию mkfifo
для создания специального файла. Несмотря на то, что запрашиваете режим 0777
, он заменяется пользовательской маской ( umask
), устанавливаемой (в данном случае 022
) точно так же, как при создании обычного файла, поэтому у результирующего файла режим 755
. Если ваша umask
установлена иначе, например, ее значение 0002
, вы увидите другие права доступа у созданного файла.
Удалить FIFO можно как традиционный файл с помощью команды rm
или внутри программы посредством системного вызова unlink
.
Доступ к FIFO
У именованных каналов есть одно очень полезное свойство: поскольку они появляются в файловой системе, их можно применять в командах на месте обычного имени файла. Прежде чем вы продолжите программирование с использованием созданного вами файла FIFO, давайте исследуем поведение такого файла с помощью обычных команд для работы с файлом (упражнение 13.10).
1. Сначала попробуйте прочесть (пустой) файл FIFO:
$ cat < /tmp/my_fifo
2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент "зависла" в ожидании появления каких-нибудь данных в FIFO:
$ echo "Hello World" > /tmp/my_fifo
Вы увидите вывод команды cat
. Если не посылать никаких данных в канал FIFO, команда cat
будет ждать до тех пор, пока вы не прервете ее выполнение, традиционно комбинацией клавиш +.
3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:
$ cat < /tmp/my_fifo &
[1] 1316
$ echo "Hello World" > /tmp/my_fifo
Hello World
[1]+ Done cat
$
Как это работает
Поскольку в канале FIFO не было данных, обе команды, cat
и echo
, приостанавливают выполнение, ожидая, соответственно, поступления каких-нибудь данных и какого-либо процесса для их чтения.
На третьем шаге процесс cat
с самого начала заблокирован в фоновом режиме. Когда echo
делает доступными некоторые данные, команда cat
читает их и выводит в стандартный вывод. Обратите внимание на то, что она затем завершается, не дожидаясь дополнительных данных. Программа cat
не блокируется, т.к. канал уже закрылся, когда завершилась вторая команда, поместившая данные в FIFO, поэтому вызовы read
в программе cat
вернут 0 байтов, обозначая этим конец файла.
Теперь, когда вы посмотрели, как ведут себя каналы FIFO при обращении к ним с помощью программ командной строки, давайте рассмотрим более подробно программный интерфейс, предоставляющий больше возможностей управления операциями чтения и записи при организации доступа к FIFO.
В отличие от канала, созданного вызовом pipe
, FIFO существует как именованный файл, но не как открытый файловый дескриптор, и должен быть открыт перед тем, как можно будет из него читать данные или в него записывать их. Открывается и закрывается канал FIFO с помощью функций open
и close
, которые вы ранее применяли к файлам, но с дополнительными функциональными возможностями. Вызову open
передается полное имя FIFO вместо полного имени обычного файла.
Интервал:
Закладка: