2012-04-05 2 views
2

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

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?

+0

У меня есть только двоичный код для первой программы, поэтому я не могу изменить его код, мне просто нужно, чтобы scanf читал из файла вместо буфера клавиатуры. :/ Помогите ? – user434885

+0

Непродолжительная минута между вопросом и вашим комментарием. :/терпение? – Puppy

ответ

5

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

program < input.txt 

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

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

+0

так что вы говорите, чтобы написать сценарий оболочки? Не могли бы вы рассказать о том, что вы ответили? Я не понимаю ... извините:/ – user434885

+0

Что такое «программа» в вашем ответе? Это идентификатор программы? или это способ его выполнения? Будет ли он всегда принимать входные данные из файла вместо клавиатуры, так как мой двоичный файл вводит несколько раз? – user434885

+1

ты, сэр, гений ... Я идиот! Я сделал это примерно в миллион раз, чтобы перенаправить вывод в файл, никогда не перешагивал, что я могу сделать то же самое со входом ... Спасибо! – user434885

-1

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

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

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

1

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

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

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

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

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

0

Вы можете закрыть стандартный дескриптор входного файла и открыть файл, который хотите прочитать, вместо этого, если вы не хотите использовать этот объект в оболочке по какой-либо причине. Он получит номер только что закрытого 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; 
} 
1

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

man 3 exec 

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