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


11

При спробі перенаправити вихідний програму з синтаксисом "деяке число більше, ніж" (наприклад foo 2> myfile), які тут можливі числа та що вони представляють?

Я вважаю, що 1 є /dev/stdout, 2 є /dev/stderr. А як щодо 5 і 6? Чи є 3, 4 або якесь число більше 6?


Відповіді:


11

Ця передбачувана програма запише у вказаний вами номер дескриптора. врахуйте наступну привіт світову програму:

#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)

write()повертає ssize_t, не int.
Ендрю Генле

Це не головний момент питання, є також повернення функції printf.
Архемар

Не використовувати повернене значення - це багато іншого, ніж використання неправильного типу .
Ендрю Генле

відредаговано Я не бачу змін у виході через ...
Архемар

10

Цифри представляють дескриптори файлів (обробляє відкриті файли).

Оболонка зазвичай має 3 налаштування автоматично,

0 - stdin 1 - stdout 2 - stderr

Але надалі файли можна відкривати, а числа збільшувати.


7

Ці числа є дескрипторами файлів . Як ви зазначали, існує декілька, які створюються автоматично. Оскільки інші файли або файлові речі відкриваються, вони отримують інші номери.

Числа, які використовуються в будь-якій конкретній програмі, залежать від того, які файли були відкриті цією програмою або використовуються іншим чином. Наприклад, якщо ви хочете "зберегти" поточний stdin і тимчасово перенаправити stdin з іншого місця, а потім відновити його пізніше, ви можете зробити щось на кшталт:

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 - stdin, 1 - stdout і 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.