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

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

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

 echo "Ваш выбор '$choice'";;

1)

 echo "Нажата Cancel";;

255)

 echo "Нажата Esc.";;

esac

Рис. 25.5. Виджит menubox

25.7. Календарь

Этот виджит позволяет пользователю удобно ввести дату. Работать с ним нужно так: с

помощью клавиши Tab выбираете нужный элемент управления: кнопка OK, Cancel, поле изменения месяца, поле изменения года, поле выбора числа; с помощью стрелок вверх/вниз указываете нужное значения месяца, года, числа и нажимаете <Ввод>. Выбранная вами дата будет отображена на консоли.

Листинг 25.8. Календарь

#!/bin/sh

: ${DIALOG=dialog}

USERDATE=`$DIALOG --stdout --title "CALENDAR" —calendar\

"Выберите дату..." \

0 0 1 1 2004`

case $? in

0)

 echo "Вы выбрали дату: $USERDATE.";;

1)

 echo "Нажата Cancel.";;

255)

 echo "Диалог закрыт";;

esac

Рис. 25.6. Календарь

25.8. Шкала прогресса

Для информирования пользователя о ходе процесса, например, копирования или обработки файла, целесообразно использовать виджит gauge (шкала прогресса).

Листинг 25.9. Шкала прогресса

#!/bin/sh

DIALOG=${DIALOG=dialog}

PCT=10

(

 while test $PCT != 100

 do

echo "XXX"

echo $PCT

echo "Выполнено\n\

($PCT %)"

echo "XXX"

PCT=`expr $PCT + 10`

# засыпаем на 1 секунду, 1 секунда - это 10%

sleep 1

 done

) |

$DIALOG --title "Шкала" --gauge "Шкала" 20 70 0

Рис. 25.7. Шкала прогресса

Глава 26

Взаимодействие процессов в Linux

26.1. Способы взаимодействия

Процессы, как и люди, могут «общаться» между собой, то есть обмениваться информацией. В главе 3 мы бегло рассмотрели два средства межпроцессного взаимодействия (IPC, Inter-Process Communication);

полудуплексные каналы (конвейеры) и сигналы, но в UNIX-системах таких средств значительно больше. В этой главе я перечислю остальные средства IPC и покажу, как использовать их в программном коде.

С давних времен существуют именованные каналы FIFO (First In — First Out) и сетевые гнезда (сокеты). Вместе с конвейерами и сигналами они составляют IPC типа BSD. Компания AT&T вместе с операционной системой System V предложила три новых вида IPC:

♦ семафоры;

♦ разделяемая память;

♦ очереди сообщений.

В операционной системе Linux поддерживаются оба типа IPC — System V и BSD, то есть в Linux мы можем использовать все вышеперечисленные способы IPC.

26.2. Полудуплексные каналы

Напомню, что канал — это способ связи стандартного вывода одного процесса со стандартным вводом другого. Каналы — старожилы UNIX: они появились еще в самых первых версиях UNIX. Полудуплексные каналы позволяют обмениваться информацией только в одном направлении. Если процесс-предок передает информацию со своего стандартного вывода на стандартный ввод потомка — это пример полудуплексного канала.

Что такое перенаправление ввода/вывода и как его использовать из командной строки, вы уже знаете (п. 3.4.6). Сейчас я покажу, как осуществить перенаправление программным путем, то есть без вмешательства пользователя.

Вызов system порождает дочерний процесс, позволяя ему читать данные со стандартного ввода (stdin) и писать на стандартный вывод (stdout). Иногда нам нужно передать данные дочернему процессу или, наоборот, получить информацию от порожденного процесса. Другими словами, мы хотим, чтобы дочерний процесс получал данные не со стандартного ввода, а от родительского процесса или/и выводил информацию не на стандартный вывод, а передавал ее процессу-предку. Ввод/вывод между процессами осуществляется с помощью системного вызова popen. Этот вызов должен быть выполнен ДО вызова fork, чтобы файловые дескрипторы были унаследованы дочерним процессом.

FILE * popen(const char * команда, const char * режим_доступа);

Первый параметр — это название программы, которую мы хотим запустить в дочернем процессе. Второй параметр определяет режим доступа. Установите значение «r», если вам нужно читать вывод дочернего процесса, если же вам нужно передать информацию на стандартный ввод порожденного процесса, установите значение «w». Режима двустороннего обмена не существует.

Вызов popen возвращает указатель FILE* или пустой указатель NULL, если вызов не удался. Так же, как и при работе с обыкновенными файлами, после завершения операции ввода/вывода вы должны закрыть канал вызовом pclose. Во время работы с потоком рекомендую использовать вызов fflush, чтобы предотвратить задержки из-за буферизации.

Теперь несколько простых примеров. Предположим, что нам нужно вывести на стандартный вывод имена всех текстовых файлов, содержащихся в текущем каталоге. Это можно очень просто сделать с помощью вызова system:

system("ls *.txt");

Это уж совсем тривиальная задача — мы просто выводим данные, но никак не обрабатываем их. Как получить все имена текстовых файлов и обработать их в программе?

// открываем поток

FILE *fp = popen("ls *.txt", "r");

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

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Командор космического флота

Борчанинов Геннадий
3. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Командор космического флота

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15

Сын Петра. Том 1. Бесенок

Ланцов Михаил Алексеевич
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Сын Петра. Том 1. Бесенок

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

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

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Законы Рода. Том 8

Андрей Мельник
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

Пипец Котенку! 2

Майерс Александр
2. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 2

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

Винокуров Юрий
1. Кодекс Охотника
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации

Аспирант

Поселягин Владимир Геннадьевич
3. Рунный маг
Фантастика:
боевая фантастика
4.50
рейтинг книги
Аспирант