2010-12-14 7 views
5

システム関数呼び出しを使用して実行されたバックグラウンドプロセスをC言語で強制終了する方法を教えてください。例えば、私はコンパイルされたアプリケーションコール "fooprocess"を持っています。それから私は、システムの機能を使用してバックグラウンドでfooprocessのアプリケーションを実行するプログラムを書きたい、親切に、コードの下を参照してくださいシステム関数呼び出しからバックグラウンドプロセスを削除する方法

const char app[] = "fooprocess &"; 
system(app); 

あなたは「&」の文字がある見ることができるように私ができるように、バックグラウンドでfooprocessアプリケーションを実行します。どのように私はこのfooprocessを殺すことができますか?

多くのありがとうございます。

+1

おそらく、 'system(" pkill fooprocess ");'? – jweyrich

+0

@jweyrich、ありがとうございました。 – domlao

答えて

5

プロセスと対話するには、PIDが必要です。 systemで可能かどうかはわかりませんが、代わりにfork + execを使用してプロセスをフォークする方法もあります。

+0

ありがとう、これのためのいくつかの基本的なコードを与えることができますか? – domlao

+1

'system'では不可能です。 OPのシステムに 'posix_spawn'がある場合、おそらく' fork'や 'exec'より使いやすくなります。 –

0


私はこれを使って、あなたの問題を試してみました:

ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill 

あなたがそうのように、そのシステムで()に置くことができます動作します

system("ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill"); 

+0

あなたが持っているのはハンマーです... –

+0

@Adam Rosenfield:それはどういう意味ですか? :-) –

+2

私が言っていることは、 'system'は仕事の間違ったツールだということです。 "あなたが持っているものはすべてハンマーですが、すべてが爪のように見えます。"適切な解決策は、子プロセスを生成するために 'system'の代わりに' fork' + 'exec'を使うことです。そして、そのプロセスとはるかに簡単に対話することができます。 –

2

system("foo &");を使用して、後で監視/強制終了できるバックグラウンドプロセスを作成することは絶対にできません。このような使用にはという巨大なという固有のバグがあります.pidを知っていても、そのpidを持つプロセスが元々実行したプロセスか、後で同じPIDを取得するプロセスが完全に異なるかどうかを判断する方法はありません。あなたは今までにsystem機能について学んだ忘れてforkexec、またはを使用して子プロセスを作成する必要があります

は、この問題解決するには(あなたが考えるようにしたくないと無数の他の問題をかそれはあなたの頭の傷を行います) posix_spawn。これにより、直接的な子プロセスが発生します(現在のメソッドは、孤児になって孫を作成して、 initプロセスによって取得されます)。 wait/ waitpidをオンにし、 wait操作を実行するまで、子プロセスのpid はあなたに属しますと再利用できないので、信号などを送信することは安全です。

関連する問題