Получение стандартного ввода после использования оператора перенаправления < - PullRequest
2 голосов
/ 26 октября 2009

Для задания на программирование у нас есть следующие требования:

  1. Это должна быть программа командной строки, написанная на C.
  2. Нужно читать текст из текстового документа. Однако мы должны сделать это, используя оператор перенаправления Unix <при запуске программы, вместо того, чтобы программа загружала сам файл. (Таким образом, программа читает текст, притворяясь, что он читает из стандартного ввода.) </li>
  3. После считывания данных из файла программа должна запросить у пользователя дополнительную информацию, прежде чем выполнять свою работу.

После долгих исследований я не могу найти способ восстановить «старый» стандарт для выполнения части (3). Кто-нибудь знает как или если это вообще возможно?

Технически часть (3) является частью бонусной секции, которую инструктор, вероятно, не реализовал сам (это очень долго), поэтому возможно, что это невозможно, и это упущение с его стороны. Однако я, конечно же, не хочу спешить с этим выводом.

Ответы [ 3 ]

5 голосов
/ 26 октября 2009

В Linux я бы открыл управляющий терминал /dev/tty.

3 голосов
/ 26 октября 2009

Какая ОС? В Linux обычная уловка для этого - проверить, подключен ли stderr к tty:

if (isatty(2))

и, если это так, откройте новый дескриптор файла чтения для этого терминала:

new_stdin = open("/proc/self/fd/2", O_RDONLY);

затем дублируйте новый дескриптор файла на стандартный ввод (который закрывает старый стандартный вывод):

dup2(new_stdin, 0);

(Если stderr также был перенаправлен, то isatty(2) вернет false и вам придется отказаться.)

1 голос
/ 27 октября 2009

Если вы запустите программу так:

myprog 3<&0 < filename

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...