5

bash シェル用の C インターフェイスを探しています。つまり、セッションを開き、コマンドを実行し、出力 (STDOUT、STDERR) を返し、最後にシェルを閉じることができる一連の関数が必要です。これは、標準ライブラリに基づくライブラリまたは C ソース コードである可能性があります。

4

2 に答える 2

1

一般的な根本的な問題は、対話型端末プログラムをプログラムで実行する方法にあるようです。

これには実際のテストが必要ですが、大まかに言うと

  1. システム コールを使用して、子プロセス、、および( および に書き込みおよび読み取りを行う親プロセス) に対応する 3 つのパイプを作成します。stdinstdoutstderrstdin_pipestdout_pipestderr_pipepipe(2)
  2. forkと子のclosedup2(2)では、 ;を呼び出して、標準の入力、出力、およびエラーを上記のパイプの適切な端にリダイレクトします。
  3. exec ( execve(2)/ execv(3)) 対話型シェル;
  4. 他の 2 つのパイプへのコマンドの書き込みstdin_pipeと、エラーと応答の読み取りを開始します。

stdout(とを区別する必要がない場合は、コマンド文字列を適切に選択することで にリダイレクトできstderrます)。popen(3)stderrstdout

ただし、適切に機能するソリューションを得るには、 fork だけでなく、疑似 tty ( pty(7)) を呼び出して使用する必要があると思います。forkpty(3)

擬似端末を扱うすべてのニュアンスを考慮に入れることがますます複雑になり始めているので、これらすべてを行うことができるはずの C 期待ライブラリを検索してみませんか。または、 expectまたはその他の同等の言語がどのようpexpectに実装されているかをエミュレートします。実際には、対話をプログラミングするために tcl/tk を書く必要がないように、あなたのためにexpect呼び出された C ライブラリを提供しているようです。libexpect(3)私は個人的にライブラリに精通していません。他にもっと良いライブラリがあるかもしれません。

于 2012-07-05T11:59:07.933 に答える
0

次のようなことを達成しようとしていますか?

    #include<stdio.h>
    int main()
    {
      char a[1000];
      gets(a);
      system(a);
      return 0;
    }

出力:

./a.out
cat testing.c
#include<stdio.h>
int main()
{
  char a[1000];
  gets(a);
  system(a);
  return 0;
}

gets()system呼び出しはループ内に入る可能性があります。

于 2012-07-05T11:01:39.133 に答える