1

重複の可能性:
シェルの作成 - コマンドの実行方法

私は C でシェルを作成する任務を負っています。これまでのところ、execvp は arg2 をパラメーターとして arg1 でプログラムを実行しようとすることを理解しています。今、これをやっているようです

execvp ("ls", args); //assume args is {"ls", ">", "awd.txt"}

コンソールでこれを入力することと同等ではありません

ls > awd.txt

同じ結果を得るには freopen を使用する必要があることは理解していますが、execvp が何をしているのか興味があります。

4

3 に答える 3

2

関数ファミリは、exec最終的にはシステム コールです。システム コールは直接カーネルに入り、通常、カーネルだけが実行できる非常に特殊なサービスを実行します。

一方、リダイレクトはシェル機能です。

したがって、ls > awd.txtシェルで入力すると、シェルは最初に を実行し、fork(2)次に子の標準出力を閉じ、次にawd.txtファイル記述子 1 で開き、それが新しい標準出力になります。

そして、その時だけ、シェルはexec-ファミリー システム コールを行います。

あなたの場合、単に文字列>awd.txtexec システムコールに渡し、そこからls. ところで、必ず execvp arg 配列を null ポインターで終了してください。


注: ご覧のとおり、リダイレクト演算子は実行されたプログラムからは見えません。Unix の前は、ファイルへの出力の送信は、オプションに基づいてすべてのプログラムで行う必要がありました。さらに豆知識: ほとんどのプログラムは、リダイレクトされたことを認識していませんが、皮肉なことに、ls その出力が tty かどうかを確認し、そうであれば、マルチカラム形式の出力を行います。

于 2013-01-27T04:45:10.503 に答える
0

lsと の2 つの引数で実行さ>awd.txtます。以下を実行するのと同じです:

'ls' '>' 'awd.txt'
于 2013-01-27T04:46:10.193 に答える
0

コマンドをシェルに直接渡すことができます。

char * const args[] = { "sh", "-c", "ls > awd.txt", NULL};
execvp("/bin/sh", args);

しかし、それは良い考えではないようです。

于 2013-01-27T04:53:20.830 に答える