Основы ОС Unix Перенаправление ввода/вывода Каналы Основы ОС Unix 14.3.08

реклама
Основы ОС 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
Скачать