3

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プログラムからの1つのバイナリのキーボード入力をシミュレートする方法はありますか?

4

5 に答える 5

7

それはあなたが探しているプログラムではなく、あなたのシェルの機能です:

 program < input.txt

このようにして、input.txtをstdinとしてプログラムにプッシュします。

プログラムが必要な場合は、プログラムを実行して、その出力を他のプログラム入力に再ルーティングするだけです。

于 2012-04-05T11:53:48.020 に答える
2

pipe基本的な対策として、プログラムを呼び出すときに簡単に使用できます。

もう1つの方法は、キーボードシミュレーターをランチャーとして機能させることです。stdinシミュレーターとしてテストしているプログラムを開始する必要がありますstdout

後者を行うにはfork、プログラムを実行し、親プロセスを使用してパイプを作成し、子プロセスを使用して、そのパイプへのファイル記述子と入力を提供するプログラムを使用してstdin(さらに)再度開きます。stdoutexec

パイプについてはこれを、ファイル記述子についてはこれを参照してください(を作成すると、ファイル記述子のみが得られるため)。pipe

PS:現時点でコードを提供できないことをお詫びしますが、私はUNIXワークステーションの近くにいないため、UNIX OSプログラミングに少し錆びすぎて、メモリから信頼できるコードを記述できません。

于 2012-04-05T12:04:07.543 に答える
1

100%確信はありませんが、exec関数の1つを使用してCコードからバイナリプログラムを起動すると、機能するはずです。はい、説明するのは難しいので)。詳細については、manページを試してください。

man 3 exec

ほとんどの場合、exec *はforkと一緒に使用されますが、あなたの場合、forkする必要はないと思います。

于 2012-04-05T12:51:46.787 に答える
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;
}
于 2012-04-05T12:30:20.850 に答える
-1

シェルは、ターミナルセッションにコマンドプロンプトを提供するプログラムです。Wikiの記事で説明されているように、単純なプログラミング言語をサポートしています。

一般的に、なじみのない用語を見ると、ウィキペディアと検索エンジンは強力な味方になります。それらを使用すると、人生はすぐに良くなります-そしてあなたの知識は指数関数的に成長します。

これがお役に立てば幸いです。

于 2012-04-05T11:58:49.497 に答える