bash シェル用の C インターフェイスを探しています。つまり、セッションを開き、コマンドを実行し、出力 (STDOUT、STDERR) を返し、最後にシェルを閉じることができる一連の関数が必要です。これは、標準ライブラリに基づくライブラリまたは C ソース コードである可能性があります。
2 に答える
一般的な根本的な問題は、対話型端末プログラムをプログラムで実行する方法にあるようです。
これには実際のテストが必要ですが、大まかに言うと
- システム コールを使用して、子プロセス、、および( および に書き込みおよび読み取りを行う親プロセス) に対応する 3 つのパイプを作成します。
stdin
stdout
stderr
stdin_pipe
stdout_pipe
stderr_pipe
pipe(2)
- forkと子のclose
dup2(2)
では、 ;を呼び出して、標準の入力、出力、およびエラーを上記のパイプの適切な端にリダイレクトします。 - exec (
execve(2)
/execv(3)
) 対話型シェル; - 他の 2 つのパイプへのコマンドの書き込み
stdin_pipe
と、エラーと応答の読み取りを開始します。
stdout
(とを区別する必要がない場合は、コマンド文字列を適切に選択することで にリダイレクトできstderr
ます)。popen(3)
stderr
stdout
ただし、適切に機能するソリューションを得るには、 fork だけでなく、疑似 tty ( pty(7)
) を呼び出して使用する必要があると思います。forkpty(3)
擬似端末を扱うすべてのニュアンスを考慮に入れることがますます複雑になり始めているので、これらすべてを行うことができるはずの C 期待ライブラリを検索してみませんか。または、 expectまたはその他の同等の言語がどのようpexpect
に実装されているかをエミュレートします。実際には、対話をプログラミングするために tcl/tk を書く必要がないように、あなたのためにexpect
呼び出された C ライブラリを提供しているようです。libexpect(3)
私は個人的にライブラリに精通していません。他にもっと良いライブラリがあるかもしれません。
次のようなことを達成しようとしていますか?
#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
呼び出しはループ内に入る可能性があります。