Почему запись в стандартный ввод работает?

Я написал в стандартный ввод, и он появился на экране (0 стандартных вводов, 1 стандартный вывод, 2 стандартных ошибки

const int SIZE=12;

int main()
{
int fd = open("input.txt", O_RDWR);
char buffer[SIZE] = "Hello world";
write(fd, buffer, SIZE - 1);

lseek(fd, 0, SEEK_SET);
char mem[SIZE];
read(fd, mem, SIZE - 1);
mem[SIZE] = '\0';

write(0, mem, SIZE - 1);
printf("\n");
write(1, mem, SIZE - 1);
printf("\n");
write(2, mem, SIZE - 1);
printf("\n");

return 0;
}

Выход:

Hello world
Hello world
Hello world

Как это работает? Разве стандартный ввод не подключен к клавиатуре?

Благодарю.

2

Решение

stdin а также stdout часто — по крайней мере в системах Linux — ссылаются на один и тот же объект в файловой системе, один файл устройства лайк /dev/tty2, Эти «файлы» генерируются конкретным драйвером, который уведомляется о любых действиях с этим файлом.

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

Когда вы пишете, драйвер знает, что ему нужно предпринять другие действия, и направляет ваши данные через программный стек драйверов / сервера отображения / эмулятора терминала, чтобы, наконец, отобразить их вам.

Поэтому, когда вы пишете stdinдрайвер видит только то, что вы записываете в его файл устройства, что означает, что он должен отображать то, что вы пишете.


Тем не менее, это определенно не переносимое поведение, поэтому не ожидайте, что это произойдет на разных платформах.

2

Другие решения

Как я понимаю, если у вас есть fd, вы можете делать с ним все, что захотите.
stdin, stdout и stderr являются константными указателями, объявленными в stdio.h, поэтому вам не нужно открывать их вручную, но вы можете «злоупотреблять» ими, записывать в один и читать из другого.

Действительно, есть системы, где stdin подключается напрямую к клавиатуре, как сказано здесь: http://www.cplusplus.com/reference/cstdio/stdin/

для получения дополнительной информации: http://pubs.opengroup.org/onlinepubs/009695399/functions/stdin.html

0

Машины UNIX изначально имели консоли, обычно соединенные последовательными кабелями. Что касается операционной системы, то удаленный экран и клавиатура представляют собой единое устройство, «консоль», соединенное одной связью.

Этот дизайн до сих пор отражается практически во всех операционных системах. Представьте, как было бы безумно, если бы это работало по-другому. Допустим, вы запускаете два консольных приложения Windows. Должны ли они использовать одну и ту же клавиатуру и экран? Или каждый из них должен иметь свое собственное окно консоли, которое имеет логический входной поток и логический выходной поток?

Если вы нажмете клавишу Backspace на клавиатуре, чтобы исправить ошибку, следует клавиатура или экран? Они должны быть одним и тем же устройством.

0

Я не могу воссоздать использование Cygwin в Windows 7.
Вот моя программа:

#include <cstdio>

int main(void)
{
static const char   text_hello[] = "Hello fwrite to stdin.\n";
fprintf(stdin, "This is from stdin.\n");
fwrite(text_hello, 1, sizeof(text_hello) - 1, stdin);

return 0;
}

Использование g ++ версии 4.9.2.
У меня ничего не отображается в окне консоли.

0
По вопросам рекламы [email protected]