как да симулирам въвеждане на клавиатура за програма на 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 като stdin за програмиране.

Ако искате програма, тогава можете просто да стартирате програма и да пренасочите нейния изход към входа на другите програми.

person Kornel Kisielewicz    schedule 05.04.2012
comment
така че искаш да напишеш shell скрипт? Бихте ли разяснили какво сте отговорили? Не разбирам... съжалявам :/ - 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 OS, за да пиша надежден код от паметта.

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 е програмата, която предоставя командния ред на терминалните сесии. Той поддържа прост език за програмиране, както е описано в неговата статия в Wiki.

Като цяло, когато видите непознат термин, Wikipedia и търсачките стават мощни съюзници. Използвайте ги и животът бързо ще стане по-добър -- и знанията ви ще растат експоненциално.

Надявам се, че това помага.

person Eric Mintz    schedule 05.04.2012