Чтение из stderr вместо stdin

Я столкнулся с таким кодом в дикой природе, и мне интересно, почему это работает. Код считывается со стандартного ввода (fd==2) вместо стандартного ввода (fd==0). Странно то, что это действительно работает. Вы можете читать, печатая на консоли, но не вводя по конвейеру. Любая идея, что здесь происходит?

#include <stdio.h>
#include <unistd.h>
int main(){
   char buf[15];
   int nchars=read(2,buf,15);
   printf("%d '%s'\n",nchars,buf);
}

person vanjoe    schedule 15.09.2017    source источник
comment
В вашем заголовке написано Чтение из stderr вместо stderr, что не имеет смысла\   -  person Dan    schedule 16.09.2017


Ответы (1)


Хороший вопрос! Это работает, потому что, когда вы находитесь в консоли в терминале, STDIN, STDOUT и STDERR в конечном итоге указывают на один и тот же ресурс: /dev/tty (или как его называет ваша платформа). Три файловых дескриптора — это один и тот же файл, открытый 3 раза (возможно, с разными параметрами).

Когда вы передаете содержимое, это уже не так, и этот сломанный код больше не работает, поскольку stdin теперь одно, а stdout/stderr — другое.

В вашем примере кода это не имеет смысла, и его лучше всего описать как ошибку. Но, возможно, автор этого «кода в дикой природе» пытался сделать что-то другое и имел на это свои причины. У вас есть ссылка на этот образец кода, который вы нашли?

person Mahmoud Al-Qudsi    schedule 15.09.2017
comment
Код находится здесь: github.com/riscv /riscv-isa-sim/blob/ Думаю, это ошибка - person vanjoe; 16.09.2017
comment
На самом деле это был просто ответ на вопрос, который я поднял в этом репозитории: github.com/riscv/riscv-isa-sim/issues/. Похоже, это было намеренно. - person vanjoe; 16.09.2017