[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Перенаправление ввода/вывода - Пример
Программа переназначает стандартный вывод и стандартный вывод
диагностики в указанный файл или устройство, приведенное в качестве
первого аргумента командной строки.
В shell такое перенаправление производится так:
prog >file 2>&1
или
prog 2>file 1>&2
Когда shell замечает амперсенд (&), за которым следует дескриптор
файла, он вызывает dup(2).
Библиотечная функция printf(3S) вызывает write(2) с файловым
дескриптором 1. printf(3S) эквивалентен fprintf(3S), использующему
stdout. Используя stderr в качестве первого аргумента, fprintf вызовет
write(2) с дескриптором 2. Программа работает следующим образом:
11-16 Сначала закрывается файловый дескриптор 1. Следующий вызов
open(2), если он завершится удачно, возвратит 1 как
наименьший свободный дескриптор. Теперь любой вывод в
файловый дескриптор 1 будет производиться в заданный файл
или устройство.
18-20 Закрывается файловый дескриптор 2. Затем копируется
дескриптор 1, возвращая 2, наименьший свободный дескриптор.
После этих действий любой вывод в файловый дескриптор 1 или
2 будет производиться в один и тот же файл или устройство.
Оба дескриптора указывают на одну и ту же системную файловую
структуру с той же самой позицией чтения/записи.
22 printf(3S) вызывает write(2) для дескриптора 1.
23 fprintf(3S) с stderr вызывает write(2) с файловым
дескриптором 2.
24_25 Эти два оператора пишут в стандартный вывод и стандартный
вывод диагностики соответственно.
Этот пример демонстрируется следующим образом:
$ dupdirect /dev/tty
first line to stdout (uses fd 1)
first line to stderr (uses fd 2)
second line to stdout
second line to stderr
Если в качестве аргумента указан файл, порядок выходных строк будет
иным:
first line to stderr (uses fd 2)
second line to stderr
first line to stdout (uses fd 1)
second line to stdout
stdout в терминал буферизован построчно. Файл, однако, буферизован по
умолчанию для стандартных библиотечных функций ввода/вывода. stderr НЕ
буферизуется.
Файл: dupdirect.c
ПЕРЕНАПРАВЛЕНИЕ ВВОДА/ВЫВОДА - ПРИМЕР
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5
6 /* demonstrate dup(2) */
7
8 main(int argc, char *argv[])
9 {
10
11 close(1);
12 if (open(argv[1], O_WRONLY |
13 O_CREAT | O_TRUNC, 0644) == -1) {
14 perror(argv[1]);
15 exit(1);
16 }
17
18 close(2);
19 if (dup(1) == -1)
20 exit(2);
21
22 printf("first line to stdout (uses fd 1)\n");
23 fprintf(stderr,"first line to stderr (uses fd 2)\n
24 printf("second line to stdout\n");
25 fprintf(stderr,"second line to stderr\n");
26 }