2011-01-07 10 views
3

からのLinuxでコマンドを私はDOS/Windowsアプリケーションで、あなたはシステムのラインが好きで使用してコードからのコマンドを発行することができることを知っている:発行システムは、C、C++

system("pause"); 

または

system("myProgram.exe"); 

.. .from stdlib.h。似たようなLinuxコマンドがありますか?そうであれば、どのヘッダファイルを見つけられますか?

また、これはプログラミングの習慣として不適切ですか?私はlsmodコマンドを使用してロードされたカーネルモジュールのリストを取得しようと考えています。それは良いアイデアか悪いアイデアですか?私は、システムコール(少なくともシステム(「一時停止」);)をマイナスの光で見ているようないくつかのウェブサイトを見つけました。

+0

私はsystem( "lsmod")またはsystem( "/ usr/bin/lsmod")を使ってそれをやっていると思います...あなたは欲しいですか? –

+1

「ポーズ」をなぜ呼びたいのですか? getch()を続行する前にユーザーがボタンを押すのを待つ場合。またはstd :: cin。取得する();私は非常に悪いフォームを使用するシステムに同意する( "一時停止"); – DeveloperChris

答えて

10

驚くことではないが、コマンドはまだ

system("whatever"); 

で、ヘッダはまだstdlib.hです。そのヘッダーファイルの名前は "標準ライブラリ"を意味します。これはCをサポートするすべての標準プラットフォームにあることを意味します。

はい、system()を呼び出すことは悪い考えです。通常、よりプログラム的な方法で作業を行います。

lsmodがどのように機能しているかを確認したい場合は、いつでもソースコードを参照して、主要なシステムコールが何であるかを確認できます。その後、あなた自身でこれらの呼び出しを使用します。

lsmod/proc/modulesの内容を読み取っていることを示すthis linkが表示されます。

3

まあ、lsmodは/proc/modulesファイルを解析することでそれを行います。それが私の好みの方法だろう。

0

あなたが探しているものは、forkとexecです。

13

systemはいくつかの理由のために悪い考えです:

  • あなたのプログラムは、コマンドが終了するまで中断されます。
  • これはシェルを介してコマンドを実行します。つまり、渡す文字列がシェルの評価に安全であることを心配する必要があります。
  • &でバックグラウンドコマンドを実行しようとすると、それは孫プロセスになり、initプロセス(pid 1)によって孤立して取り込まれ、その状態を確認する方法がありません。
  • コマンドの出力をプログラムに読み込む方法はありません。

最初と最後の問題についてはpopenが1つの解決策ですが、それ以外の問題は解決しません。任意の外部コマンド/プログラムの実行には、実際にforkexec(またはposix_spawn)を使用する必要があります。

+0

危険についての大きな説明。そして、はい、 'posix_spawn()'が好ましい方法です。 – chrisaycock

+2

OPの特別な必要性のために、 'lsmod'を使うのではなく、'/proc/modules'を解析することが正しい解決法です。 –

+1

私は前にposix_spawn()を見たことがありませんが、どのようなパラメータのリストがわかりますか?私は、system()へのこれらの短所は、あなたが達成しようとしているものに固有のものであると付け加える価値があると感じています。私はしばしば、コマンドのシェル解釈(もちろん、コマンドをバックグラウンドで囲む)のためにそれを使用します。私が望むのは、副作用または終了コードだけです。 – boycy

関連する問題