LinuxでCからシェルスクリプトを実行するにはどうすればよいですか?
それは、スクリプト(または実行する他のプログラム)で何をしたいかによって異なります。
スクリプトを実行したいだけの場合がsystem
最も簡単ですが、シェルを実行してコマンド(ほとんどの* nixでは/ bin / sh)を実行するなど、他のことも実行します。
標準入力を介してシェルスクリプトをフィードするか、標準出力を消費する場合は、popen
(およびpclose
)を使用してパイプを設定できます。また、シェル(ほとんどの* nixでは/ bin / sh)を使用してコマンドを実行します。
これらはどちらも内部で多くのことを行うライブラリ関数ですが、ニーズに合わない場合(または単に実験して学びたい場合)は、システムコールを直接使用することもできます。これにより、シェル(/ bin / sh)にコマンドを実行させる必要もなくなります。
関心のシステムコールはfork
、execve
とwaitpid
。ライブラリラッパーの1つを使用することもできますexecve
(man 3 exec
それらのリストのタイプ)。他の待機関数のいずれかを使用することもできます(man 2 wait
それらすべてを備えています)。また、あなたは、システムコールに興味がある可能性がありclone
とvfork
フォークに関連しています。
fork
現在のプログラムを複製します。唯一の主な違いは、新しいプロセスがforkの呼び出しから0を返すことです。親プロセスは、新しいプロセスのプロセスID(またはエラー)を返します。
execve
現在のプログラムを新しいプログラムで置き換えます(同じプロセスIDを維持)。
waitpid
親プロセスが特定の子プロセスの終了を待つために使用されます。
forkとexecveのステップを別々にすると、プログラムは、それ自体が作成される前に、それ自体を台無しにすることなく、新しいプロセスの設定を行うことができます。これらには、標準入力、出力、およびstderrを、使用する親プロセスとは異なるファイルに変更する、プロセスのユーザーまたはグループを変更する、子が必要としないファイルを閉じる、セッションを変更する、または環境変数を変更することが含まれます。
pipe
およびdup2
システムコールにも興味があるかもしれません。pipe
パイプを作成します(入力ファイル記述子と出力ファイル記述子の両方を使用)。dup2
ファイル記述子を特定のファイル記述子として複製します(dup
似ていますが、ファイル記述子を使用可能な最低のファイル記述子に複製します)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加