как имитировать ввод с клавиатуры для программы на C

У меня есть двоичный файл программы, которая ожидает ввода с помощью scanf. Мне нужно написать код C, который сможет имитировать ввод с клавиатуры. то есть закрыть указатель stdin для этого двоичного файла и вместо этого перенаправить его на файл. я использовал этот код

int main()
{
        FILE *fin;
        int result;
        char string[80];
        close(0);

        fin = fopen("text", "r");

        if(NULL == fin)
        {
                printf("Unable to open file.");
                return 0;
        }
        dup(fin);
        return 0;
}

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


person user434885    schedule 05.04.2012    source источник
comment
У меня есть только двоичный файл для первой программы, поэтому я не могу изменить ее код, мне просто нужно, чтобы scanf читал из файла вместо буфера клавиатуры. :/ помощь ?   -  person user434885    schedule 05.04.2012
comment
Между вопросом и комментарием прошло меньше минуты. :/ терпение ?   -  person Puppy    schedule 05.04.2012


Ответы (5)


Это не программа, которую вы ищете, это возможности вашей оболочки:

 program < input.txt

Таким образом, вы нажимаете input.txt как стандартный ввод для программирования.

Если вам нужна программа, вы можете просто запустить программу и перенаправить ее вывод на ввод других программ.

person Kornel Kisielewicz    schedule 05.04.2012
comment
так вы говорите написать сценарий оболочки? Не могли бы вы уточнить, что вы ответили? Я не понимаю... извините :/ - person user434885; 05.04.2012
comment
что за программа в вашем ответе? Это идентификатор программы? или это способ его выполнить? Будет ли он всегда вводить данные из файла, а не с клавиатуры, поскольку мой двоичный файл вводит данные несколько раз? - person user434885; 05.04.2012
comment
вы-с, гений... Я идиот! Я делал это около миллиона раз, чтобы перенаправить вывод в файл, и мне никогда не приходило в голову, что я могу сделать то же самое с вводом... Спасибо! - person user434885; 05.04.2012

Вы можете использовать простой pipe при вызове программ в качестве основной меры.

Другой способ — заставить симулятор клавиатуры действовать как средство запуска. Программа, которую вы тестируете, должна запускаться с stdin в качестве stdout вашего симулятора.

Вы можете сделать последнее, fork создав свою программу и используя родительский процесс для создания канала, а дочерний процесс для повторного открытия stdin (даже stdout) с использованием файлового дескриптора для этого канала и exec программы, в которую вы хотите предоставить входные данные.

См. это для каналов и это для файловых дескрипторов (поскольку создание pipe даст вы только файловый дескриптор).

P.S.: Извините, что в данный момент не могу предоставить код, но у меня нет поблизости рабочей станции UNIX, и я слишком заржавел в программировании ОС UNIX, чтобы писать надежный код по памяти.

person lucian.pantelimon    schedule 05.04.2012

Я не уверен на 100%, но если вы используете одну из функций exec для запуска вашей двоичной программы из кода C, она должна работать. Потому что да, это трудно объяснить). Для получения дополнительной информации попробуйте справочную страницу:

man 3 exec

Большую часть времени exec* используется вместе с fork, но в вашем случае я не думаю, что вам нужен fork.

person aisbaa    schedule 05.04.2012

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

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

int main(void)
{
    int fd;
    char buf[128];

    close(STDIN_FILENO);

    fd = open("./testfile", O_RDONLY);
    if(fd < 0) return 1;

    scanf("%127[ a-z0-9]", buf);
    puts(buf);

    close(fd);
    return 0;
}
person foo    schedule 05.04.2012

Shell — это программа, которая предоставляет командную строку для терминальных сеансов. Он поддерживает простой язык программирования, как описано в его Вики-статье.

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

Надеюсь, что это поможет.

person Eric Mintz    schedule 05.04.2012