Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гл.8 ОС буклет.doc
Скачиваний:
5
Добавлен:
11.11.2018
Размер:
286.21 Кб
Скачать

8.2.2. Перераспределение потоков ввода-вывода

Важной технологией, которую реализуют командные интерпретаторы, является перераспределение потоков ввода-вывода. При этом программа вместо использования терминала для стандартного потока ввода и стандартного потока вывода работает с файлом.

$ sort > out.txt

$ sort < in.txt.

Во время выполнения таких команд результат вывода очутится не на экране, а в файле out.txt, а ввод будет выполнено не из клавиатуры, а из файла in.txt. При этом ожидание ввода с клавиатуры не будет.

Можно пераспределить одновременно и поток ввода, и поток вывода:

$ sort < in.txt > out.txt

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

Стандартный дескриптор, который отвечает файлу сообщений об ошибках stderr, при этом не перенаправляют. Для его перенаправления используют такой синтаксис:

$ sort 2> err.txt

Перенаправление потоков ввода-вывода в POSIX

Реализация перенаправления потоков ввода-вывода в POSIX основывается на том, что заранее определены дескрипторы не закрепленные за конкретными файлами. Перед созданием процесса или во время его выполнения можно изменить соответствующую ячейку таблицы дескрипторов так, чтобы он ссылался на другой открытый файл. В итоге все системные вызовы, которые используют в качестве параметра этот файловый дескриптор, будут работать с этим файлом, а не с управляющим терминалом.

Для перенаправления потоков ввода-вывода необходимо, чтобы заранее определенный файловый дескриптор ссылался на тот же файл, что и дескриптор oldfd, открытый с помощью open(). Чтобы вынудить имеющийся дескриптор ссылаться на тот же файл, что и другой дескриптор, можно использовать системный вызов dup2().

Int dup2(int fdl. Int newfd);

где: fdl - выходной открытый дескриптор;

newfd - имеется дескриптор, который будет ссылаться на тот же файл, что и fdl.

Вот пример перенаправления потока вывода:

int fdl:

write(STDOUT_FILEND. "на консоль\ n". 11);

fdl = ореn(“output-log.txt. 0_GREAT O_RDWR. 0644):

// переспрямування выведение, аналог myprog > output-log.txt

dup2(fdl. STDOUT_FILEND):

// здесь STDOUT_FILEND ссылается на тот же файл, что и fdl

write(STDOUT_FILEND. "у файл\ n". 7);

с1оsе(fdl):

Отметим, что вызов close() в этом случае закроет только один из двух дескрипторов, STDOUT_FILEND останется открытым, и через него можно продолжать работу с файлом.

Подобный код можно использовать и для перенаправления потоков ввода-вывода процесса-потомка (как это делает командный интерпретатор), здесь вызовы open() и dup2() выполняют в потомке после вызова fork(), но перед вызовом exec().

Перенаправление потоков ввода-вывода в Win32

Для реализации перенаправления потоков ввода-вывода в рамках одного процесса в Win32 используют функцию SetStdHandle()

В00L SetStdHandle (DWORD std_const. Handle fh):

Здесь std_const приобретает те же значения, что и для GetStdHandle (), а fh отображает открытый файл.

8.3. Графический интерфейс пользователя

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

Различают два основных подхода к реализации графического интерфейса пользователя. Для первого характерная тесная интеграция в систему средств его поддержки (они, например, могут быть реализованные в режиме ядра). Второй реализует поддержку такого интерфейса с использованием набора программ и библиотек уровня пользователя, который основываются на средствах подсистемы ввода-вывода. В этом разделе как пример интегрированной поддержки графического интерфейса пользователя будет описано оконная и графическая подсистемы Windows ХР, а как пример реализации его поддержки в режиме пользователя - систему X Window.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]