read () в stdin, возвращающем EOF вместо ожидания ввода - PullRequest
1 голос
/ 12 октября 2011

Кто-нибудь знает, почему выполнение следующего кода может привести к тому, что все будущие вызовы read () для этого fd (который является stdin) будут немедленно возвращать 0 вместо блокировки ввода?

termios newTerminalSettings;
tcgetattr(inFd, &newTerminalSettings);
newTerminalSettings.c_lflag &= ~ICANON;
tcsetattr(inFd, TCSANOW, &newTerminalSettings);

Удаление строки tcsetattr приводит к тому, что read () работает как положено.

Также пробовал:

fcntl(inFd, F_SETFL, 0);

без удачи.

Обратите внимание, что в настоящее время у меня есть 2 разных терминала,При запуске приложения в одном из них чтение сразу же возвращается.Запуск его в другом вызывает чтение, чтобы заблокировать для ввода.Что бы это могло быть?

Заранее спасибо: -)

Источник воспроизведения:

#include <iostream>
#include <termios.h>

using namespace std;

int main(void) {
    termios newTerminalSettings;
    tcgetattr(0, &newTerminalSettings);
    newTerminalSettings.c_lflag &= ~ICANON;
    tcsetattr(0, TCSANOW, &newTerminalSettings);

    char readBuf[5000];
    cout << "read returned: " << read(0, readBuf, sizeof(readBuf));

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Имейте в виду, что драйвер tty поддерживает входную очередь байтов, уже прочитанных из последовательной строки и не переданных пользователю, поэтому не каждый вызов read () ожидает фактического ввода-вывода - чтение может оченьхорошо быть удовлетворенным непосредственно из входной очереди.

См. здесь

0 голосов
/ 06 ноября 2011

Я думаю, что ваша проблема заключается в маскировке ICANON, который, в свою очередь, отключает канонический режим (включает неканонический режим). Согласно справочной странице termios (3):

"В неканоническом режиме ввод доступен немедленно (без необходимости вводить символ разделителя строк), и редактирование строки отключено."

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

Гергелий из Топтал Инжиниринг

...