Как и Пит Киркхам , я нашел cc.byexamples.com , и это сработало для меня. Здесь вы найдете хорошее объяснение проблемы, а также версию ncurses.
Мой код должен был взять начальную команду из стандартного ввода или файла, а затем наблюдать за командой отмены, пока исходная команда была обработана. Мой код на C ++, но вы должны быть в состоянии использовать scanf () и остальные, где я использую функцию ввода C ++ getline ().
Мясо - это функция, которая проверяет, есть ли доступный ввод:
#include <unistd.h>
#include <stdio.h>
#include <sys/select.h>
// cc.byexamples.com calls this int kbhit(), to mirror the Windows console
// function of the same name. Otherwise, the code is the same.
bool inputAvailable()
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
return (FD_ISSET(0, &fds));
}
Это должно быть вызвано перед любой функцией ввода stdin. Когда я использовал std :: cin перед использованием этой функции, она никогда больше не возвращала true. Например, main () имеет цикл, который выглядит следующим образом:
int main(int argc, char* argv[])
{
std::string initialCommand;
if (argc > 1) {
// Code to get the initial command from a file
} else {
while (!inputAvailable()) {
std::cout << "Waiting for input (Ctrl-C to cancel)..." << std::endl;
sleep(1);
}
std::getline(std::cin, initialCommand);
}
// Start a thread class instance 'jobThread' to run the command
// Start a thread class instance 'inputThread' to look for further commands
return 0;
}
Во входном потоке новые команды были добавлены в очередь, которая периодически обрабатывалась заданием jobThread. InputThread выглядела примерно так:
THREAD_RETURN inputThread()
{
while( !cancelled() ) {
if (inputAvailable()) {
std::string nextCommand;
getline(std::cin, nextCommand);
commandQueue.lock();
commandQueue.add(nextCommand);
commandQueue.unlock();
} else {
sleep(1);
}
}
return 0;
}
Эта функция, возможно, могла быть в main (), но я работаю с существующей кодовой базой, а не против нее.
Для моей системы не было доступного ввода до отправки новой строки, что было именно тем, что я хотел. Если вы хотите прочитать каждый символ при вводе текста, вам нужно отключить «канонический режим» в stdin. cc.byexamples.com содержит некоторые предложения, которые я не пробовал, но остальные сработали, поэтому он должен работать.