Нет вывода через S SH до ожидания ввода через scanf () - PullRequest
1 голос
/ 13 февраля 2020

У меня есть файл с именем get_int.c в удаленной системе Unix, содержащий следующее:

#include <stdio.h>

int main() {
    int input;

    printf("Give an integer: ");
    fflush(stdout);
    scanf("%d", &input);

    printf("Try again: ");
    scanf("%d", &input);

    printf("You said... %d\n", input);

    return 0;
}

У меня есть команда для компиляции и запуска этого файла из моего локального WSL:

sshpass -f pass.txt ssh username@remote.host.address "cd path/to/file/ && gcc get_int.c && a.out"

Когда я выполняю эту команду, я успешно получаю приглашение Give an integer:, предоставляю его и нажимаю ввод. Тогда, однако, я не получаю приглашение Try again:. Я все еще могу ввести целое число (123) и нажать клавишу ввода. Когда я это сделаю, он печатает Try again: You said... 123

Как видите, печать не происходит, пока я либо fflush(stdout), либо программа не завершится. Могу ли я изменить свою команду s sh, чтобы вывод шел на локальный терминал без необходимости fflush перед каждым scanf?

1 Ответ

2 голосов
/ 13 февраля 2020

Вывод в stdout, по-видимому, не сбрасывается при чтении из stdin в вашей системе при определенных описанных c обстоятельствах. Вы должны грипп sh stdout явно с fflush() перед каждым вызовом scanf():

#include <stdio.h>

int main() {
    int input;

    printf("Give an integer: ");
    fflush(stdout);
    scanf("%d", &input);

    printf("Try again: ");
    fflush(stdout);
    scanf("%d", &input);

    printf("You said... %d\n", input);

    return 0;
}

В качестве альтернативы, вы можете установить выходной поток как небуферизованный и не нужно грипп sh это вообще:

#include <stdio.h>

int main() {
    int input;

    setvbuf(stdout, NULL, _IONBF, 0);

    printf("Give an integer: ");
    scanf("%d", &input);

    printf("Try again: ");
    scanf("%d", &input);

    printf("You said... %d\n", input);

    return 0;
}
...