LinuxでCからシェルスクリプトを実行するには?



Linux で C からシェル スクリプトを実行するにはどうすればよいですか?


答え:


スクリプト (または実行したい他のプログラム) で何をしたいかによって異なります。


スクリプト system を実行するだけの場合 は最も簡単な方法ですが、シェルの実行やコマンド (ほとんどの *nix では /bin/sh) の実行など、他のことも行います。


標準入力を介してシェルスクリプトにフィードするか、標準出力を使用する場合は、 popen を使用できます (そして pclose ) パイプを設定します。これはまた、シェル (ほとんどの *nix では /bin/sh) を使用してコマンドを実行します。


これらはどちらも、内部で多くのことを行うライブラリ関数ですが、ニーズに合わない場合 (または単に実験して学習したい場合) は、システム コールを直接使用することもできます。これにより、シェル (/bin/sh) がコマンドを実行するのを回避することもできます。


対象となるシステム コールは fork です。 、 execve 、および waitpid . execve あたりのライブラリ ラッパーの 1 つを使用することをお勧めします。 (タイプ man 3 exec それらのリストについては)。他の待機関数 (man 2 wait) のいずれかを使用することもできます。 それらをすべて持っています)。さらに、システムコール clone に興味があるかもしれません および vfork フォークに関連しています。


fork 現在のプログラムを複製します。唯一の主な違いは、新しいプロセスが fork の呼び出しから 0 を返すことです。親プロセスは、返された新しいプロセスのプロセス ID (またはエラー) を取得します。


execve 現在のプログラムを新しいプログラムに置き換えます (同じプロセス ID を維持します)。


waitpid 親プロセスが特定の子プロセスの終了を待機するために使用されます。


fork と execve のステップを別々にすると、プログラムは新しいプロセスを作成する前に (それ自体を台無しにすることなく) セットアップを行うことができます。これらには、標準入力、標準出力、および stderr を使用する親プロセスとは異なるファイルに変更する、プロセスのユーザーまたはグループを変更する、子が必要としないファイルを閉じる、セッションを変更する、または環境変数を変更することが含まれます。 /P>

pipe にも興味があるかもしれません と dup2 システムコール。 pipe パイプを作成します (入力ファイル記述子と出力ファイル記述子の両方を使用)。 dup2 ファイル記述子を特定のファイル記述子として複製します (dup 似ていますが、ファイル記述子を利用可能な最小のファイル記述子に複製します)。