Я написал в стандартный ввод, и он появился на экране (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
Как это работает? Разве стандартный ввод не подключен к клавиатуре?
Благодарю.
stdin
а также stdout
часто — по крайней мере в системах Linux — ссылаются на один и тот же объект в файловой системе, один файл устройства лайк /dev/tty2
, Эти «файлы» генерируются конкретным драйвером, который уведомляется о любых действиях с этим файлом.
Когда вы читаете из него, драйвер получает доступ (каким-то образом, возможно, через несколько других драйверов) к клавиатуре, с которой вы сидите, и возвращает все, что вы печатаете (отфильтрованные по слоям программного обеспечения между ними), как содержимое файла.
Когда вы пишете, драйвер знает, что ему нужно предпринять другие действия, и направляет ваши данные через программный стек драйверов / сервера отображения / эмулятора терминала, чтобы, наконец, отобразить их вам.
Поэтому, когда вы пишете stdin
драйвер видит только то, что вы записываете в его файл устройства, что означает, что он должен отображать то, что вы пишете.
Тем не менее, это определенно не переносимое поведение, поэтому не ожидайте, что это произойдет на разных платформах.
Как я понимаю, если у вас есть fd, вы можете делать с ним все, что захотите.
stdin, stdout и stderr являются константными указателями, объявленными в stdio.h, поэтому вам не нужно открывать их вручную, но вы можете «злоупотреблять» ими, записывать в один и читать из другого.
Действительно, есть системы, где stdin подключается напрямую к клавиатуре, как сказано здесь: http://www.cplusplus.com/reference/cstdio/stdin/
для получения дополнительной информации: http://pubs.opengroup.org/onlinepubs/009695399/functions/stdin.html
Машины UNIX изначально имели консоли, обычно соединенные последовательными кабелями. Что касается операционной системы, то удаленный экран и клавиатура представляют собой единое устройство, «консоль», соединенное одной связью.
Этот дизайн до сих пор отражается практически во всех операционных системах. Представьте, как было бы безумно, если бы это работало по-другому. Допустим, вы запускаете два консольных приложения Windows. Должны ли они использовать одну и ту же клавиатуру и экран? Или каждый из них должен иметь свое собственное окно консоли, которое имеет логический входной поток и логический выходной поток?
Если вы нажмете клавишу Backspace на клавиатуре, чтобы исправить ошибку, следует клавиатура или экран? Они должны быть одним и тем же устройством.
Я не могу воссоздать использование 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.
У меня ничего не отображается в окне консоли.