Перенаправление вывода программы

11

При попытке перенаправить вывод программы с синтаксисом «некоторое число больше, чем» (например foo 2> myfile), какие здесь возможные числа и что они представляют?

Я считаю, 1 есть /dev/stdout, 2 есть /dev/stderr. А как насчет 5 и 6? Есть ли 3, 4 или какое-то число больше 6?

Студент Ферма
источник
Смотрите также Когда бы вы использовали дополнительный файловый дескриптор?
Жиль "ТАК - перестань быть злым"

Ответы:

11

Эта предполагаемая программа запишет в номер дескриптора файла, который вы указали. рассмотрим следующую программу Hello World:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

скомпилируйте это

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

теперь простой запуск

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

нет файла для 5, так что ни одного байта не написано.

следующая попытка:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

Мне удается получить вывод при указании файла и дескриптора файла (например 5>u).

На практике, если вы не написали такую ​​забавную программу, как указано выше, вы вряд ли соберете данные с помощью 5>foo.

в сценарии оболочки более полезно использовать конструкцию с использованием <():

 diff <( cmd -par 1 ) <(cmd -par 2)
Archemar
источник
write()возвращается ssize_t, нет int.
Эндрю Хенле
Это не главное, вопрос также есть и для функции printf.
Архемар
Отсутствие возвращаемого значения сильно отличается от использования неправильного типа .
Эндрю Хенле
Отредактировано Я не вижу изменений в выводе, хотя ...
Archemar
10

Числа представляют файловые дескрипторы (дескрипторы файлов, которые были открыты).

Оболочка обычно имеет 3 набора автоматически,

0 - стандартный 1 - стандартный 2 - стандартный

Но в дальнейшем файлы могут быть открыты, и числа увеличиваются.

X Тянь
источник
7

Эти числа являются файловыми дескрипторами . Как вы заметили, есть несколько, которые создаются автоматически. Когда открываются другие файлы или подобные файлы, они получают другие номера.

Числа, которые используются в любой конкретной программе, зависят от того, какие файлы были открыты этой программой или использованы иным образом. Например, если вы хотите «сохранить» текущий стандартный ввод и временно перенаправить стандартный ввод из другого места, а затем восстановить его позже, вы можете сделать что-то вроде:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

Таким образом, этот сценарий будет иметь 4дескриптор файла, доступный, по крайней мере, в течение некоторого времени. Эта 4 может быть чем-то, что не используется, хотя (ну, есть ограничение на количество файлов, которые может открыть процесс, но все, что находится в пределах этого предела).

Вы можете увидеть, какие файловые дескрипторы открыты у процесса, и где они открыты, заглянув внутрь /proc/<pid>/fd. Это показывает все дескрипторы открытых файлов для этого процесса <pid>и с какими файлами они связаны.

Эрик Ренуф
источник
0

Любой процесс получает целые числа в качестве файловых дескрипторов, где в POSIX есть три зарезервированных: 0 - это стандартный ввод, 1 - это стандартный вывод, а 2 - это stderr. Любые дальнейшие файлы будут назначены дальнейшие номера. Вы можете проверить это легко с помощью этой программы, сохранить его как fdtest.c , так что открыть свой собственный программный код во время выполнения:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

Скомпилируйте это:

gcc fdtest.c -o fdtest

Запустить его:

./fdtest

Вывод, который вы получите, будет примерно таким:

3

... это номер дескриптора файла, на который ссылается переменная fd.

rexkogitans
источник