Основы ОС Unix Перенаправление ввода/вывода Каналы Основы ОС Unix 14.3.08 Слайд 1 из 34 Сегодня: взаимодействие процессов через fd Основы ОС Unix 14.3.08 Слайд 2 из 34 Цели ● ● ● ● ● Перенаправление (redirection) ввода/вывода Дублирование файловых дескрипторов Каналы и фильтры Неименованные каналы Именованные каналы FIFO Основы ОС Unix 14.3.08 Слайд 3 из 34 Перенаправление (redirection) $ cat input <ENTER> input <CTRL><D> $ cat < file $ cat > file $ cat < file1 > file2 $ cat >> file Основы ОС Unix 14.3.08 ● стандартный ввод/вывод ● ● ● ● ● ● <конец файла> перенаправляем ввод ... вывод ... оба сразу ... вывод с конкатенацией Слайд 4 из 34 Дудублирование файловых дескрипторов Системный вызов dup(2) Системный вызов dup2(2) #include <unistd.h> int dup(int oldfd); #include <unistd.h> int dup(int oldfd, int newfd); создает копию oldfd, используя наименьший свободный в таблице файлов процесса fd. создает копию oldfd, закрывая newfd, если необходимо. Основы ОС Unix 14.3.08 Слайд 5 из 34 Пример int fd = open(..., "r"); read(fd, ...); /* читаем из файла */ ... close(0); /* освобождаем 0-ой дескриптор */ dup(fd); /* дублируем стандартный ввод */ ... read(fd, ...); /* теперь читаем из стандартного потока ввода */ Основы ОС Unix 14.3.08 Слайд 6 из 34 Каналы и фильтры $ $ $ $ $ $ cat .bash_history | less cat file | more ls | wc -l cat file | sort ls -R | grep filename dmesg | tail Основы ОС Unix 14.3.08 Слайд 7 из 34 Неименованный канал fd[1] Канал fd[0] pipe(fd) write() read() Процесс Основы ОС Unix 14.3.08 Слайд 8 из 34 Системный вызов pipe(2) #include <unistd.h> int pipe(int fd[2]); • Создает канал с двуя файловыми дескрипторами – fd[0] только для чтения, – fd[1] только для записи. • Работает как очередь сообщений (no offset!) • Представляется в ядре буфером размером PIPE_BUF Основы ОС Unix 14.3.08 Слайд 9 из 34 Коммуникация между родителем и потомком Канал pipe fork write() fd[1] Процесс родитель Основы ОС Unix 14.3.08 read() fd[0] Процесс потомок Слайд 10 из 34 Пример: ls | wc -l Основы ОС Unix 14.3.08 Слайд 11 из 34 В чем отличие следующих команд? $ ls | wc -l $ ls > temp && wc -l < temp && rm temp Основы ОС Unix 14.3.08 Слайд 12 из 34 Функции popen(3), pclose(3) #include <stdio.h> FILE* popen(const char* cmd, const char* type); int pclose(FILE* stream); создает/закрывает подпроцесс для выполнения команды cmd с созданием канала для чтения или записи: type = “r” или “w”: • pipe • fork • exec (/bin/sh -c cmd) Основы ОС Unix 14.3.08 Слайд 13 из 34 Пример Основы ОС Unix 14.3.08 Слайд 14 из 34 Именованные каналы FIFO ● ● Именованный канал – специальный файл для коммуникации процессов по FIFO Создание FIFO $ mknod fifo-file p $ mkfifo fifo-file Основы ОС Unix 14.3.08 Слайд 15 из 34 Упражнение с FIFO ● ● ● Откройте терминал и создайте FIFO $ mknod fifo-file p $ ls -l fifo-file prw-rw-rw 1 user group 0 Sep 21 9:40 fifofile Введите команду (используется стандартный вывод для cat) $ cat < fifo-file Откройте второй терминал (тот же рабочий директорий) и введите (используется стандартный ввод cat) $ cat > fifo-file Теперь печатайте в этом окне прямо в канал! Основы ОС Unix 14.3.08 Слайд 16 из 34 Системный вызов mknod(2) #include #include #include #include <sys/types.h> <sys/stat.h> <fcntl.h> <unistd.h> int mknod(const char *pathname, mode_t mode, dev_t dev); pathname - имя файла/устройства/им. канала mode - тип файла и права доступа dev - идентификация драйвера устройства Основы ОС Unix 14.3.08 Слайд 17 из 34 Функция mkfifo(3) #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); Основы ОС Unix 14.3.08 Слайд 18 из 34 Литература ● ● ● Робачевский А. М. Операционная система UNIX®. СПб.: 2002. Бовет Д. Ядро Linux. 3-е изд. СПб.: 2007. Сивер Э., Спейнауэр С„ Фиггинс С., Хекман Д. Linux. Справочник. - Пер. с англ. - СПб: СимволПлюс, 2001. Основы ОС Unix 14.3.08 Слайд 19 из 34