Чтение ввода с консоли без ожидания безоговорочно (без ожидания сканирования) - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь написать код для непрерывного чтения ввода с консоли и обновления переменной в приложении.Но если мы используем функцию scanf, при каждом обращении к функции она ожидает ввода от пользователя через консоль и продолжает выполнение дальнейших инструкций, только если она получает ввод с консоли, в противном случае она ожидает безоговорочно.

Мой код - это что-токак

    int x, y;
    while(1)
    {
        scanf("%d", &x);
        y = x;
        ----
        ----
       //Remaining code for execution
    }

Я ожидаю, что приложение не должно ждать ввода от консоли.Если пользователь вводит какой-то ввод в консоль, он должен прочитать и использовать этот ввод, в противном случае, даже если ввод не введен, приложение должно выполнить оставшиеся инструкции или использовать старые значения.Есть ли другой способ написать такой код без использования scanf?Спасибо!

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

Вы можете использовать select() с нулевым (не NULL) тайм-аутом, чтобы проверить, доступны ли данные, и только затем вызывать scanf.

Пример (без правильной обработки ошибок):

#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>

int main()
{
    int x;
    fd_set fds;
    struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };

    while (1) {
        FD_ZERO(&fds);
        FD_SET(0, &fds);  // Watch stdin (fd 0)
        if (select(1, &fds, NULL, NULL, &tv)) {
            scanf("%d", &x);
            printf("Got %d from stdin", x);
        }

        printf("Working..\n");
        sleep(1);
    }
}
0 голосов
/ 26 сентября 2019

Вы можете установить stdin для неблокирования с помощью fcntl.scanf

Пример (без правильной обработки ошибок):

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
    int x;
    fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);

    while (1) {
        int ret = scanf("%d", &x);
        if (ret > 0)
            printf("Got %d from stdin", x);

        printf("Working..\n");
        sleep(1);
    }
}
Это заставляет *1002* рано возвращаться с EAGAIN.
0 голосов
/ 26 сентября 2019

Вы можете выбрать функцию () / epoll () для получения ввода, если время ожидания истечет, оно продолжится дальше.Поскольку stdin также является FD, вы можете зарегистрировать FD для выбора для работы с данным FD.

См .: https://stackoverflow.com/a/21198059/6686352

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