[<<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 }