2013-11-28 4 views
3

Эта проблема может быть немного сложной. Например, программа получит строку из stdin, но нужен интерактивный ввод от пользователя, например:Как прервать стандартный поток ввода для другого

echo "Some text to handle later after command is specified" | a.out 

А в начале программы:

printf("Please input command first"); 
scanf("%s", &cmd); 
/* Some Code Here */ 
/* process "Some text to handle later after command is specified" */ 

Есть ли способ «приостановить» предыдущий входной поток и дождаться scanf?

ответ

1

В стандарте не указывается какой-либо способ получить интерактивный ввод пользователя, кроме чтения из stdin. Поскольку ваш stdin занят трубой, вам нужно протекторать путь к реализации.

Для Unix-подобных систем, которые были бы специальным файлом с именем /dev/tty. fopen и использовать обычные функции stdio.

В Windows вам, вероятно, необходимо вызвать API консоли.

Threre не гарантирует, что программа подключена к любому интерактивному устройству, поэтому подготовьтесь к сбою.

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

1

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

Проблема заключается в том, что вы не должны печатать какой-либо выход, если входной сигнал выполнен из трубы (или перенаправления). Это может быть сделано путем проверки результата функции isatty:

if (isatty(fileno(stdin))) 
{ 
    /* Only print prompt if input is an interactive terminal */ 
    printf(...); 
} 

scanf(...); 

Или я вас неправильно понимаю, что вы хотите прочитать как от пользователя, и из трубы? Тогда вам, вероятно, придется открыть прямое соединение с терминалом.

Для этого вы можете использовать ttyname, чтобы получить имя устройства TTY stdout и открыть это устройство для ввода, чтобы прочитать ввод пользователя. Это не сработает, если stdout ведет к трубе (или перенаправляется).

Смежные вопросы