dポイントプレゼントキャンペーン実施中!

system関数でシェルコマンドを発行しているC言語のプログラムがあります。
起動されるシェルコマンド(Cシェル)は2重起動防止のため以下の様にコマンド名をgrepしてPIDを取得し、2つ以上あると2重起動と見なしてコマンドを終了させています。
ps -aef | grep 自身のコマンド名 | grep -v grep ~

この時1回目の起動であるのに2重起動チェックに引っかかってしまいコマンドが実行されませんでした。
デバッグしたところ"csh コマンド名"のPIDとは別に一瞬"sh -c コマンド名"というプロセスがあってそれのPIDと合わせて2つに起動していると見なしていました。
調べたところsystem関数はsh経由(sh -c)でコマンドを実行するためだと言う事が分かり納得出来ました。

また元々バックグラウンドで起動させたいコマンドだったので以下の様に"&"を付与したところ2重起動チェックには引っかからなくなりました。
system("コマンド名 &")

バックグラウンド起動させても2重起動チェックで弾かれれば納得出来るのですが、通常の起動と何が違うか分からずに釈然としません。

良く分かりませんが、通常起動だとオーバーヘッドで実行に時間がかかりチェックで弾かれるけど、バックグラウンドだと一瞬で起動されてたまたま上手く行った様に見えるだけだったりするなどなのでしょうか??

もしご存知の方がいらっしゃいましたらご教示頂けると幸いです。

A 回答 (1件)

フォアグラウンドだと、シェルはコマンドの終了を待つのでコマンド終了まで、sh -c プロセスは残ります。

一瞬ではないはず。
バックグラウンドだと、シェルはコマンドの終了を待たないので、起動時の一瞬のみの実行です。

system("exec コマンド"); と、execコマンドを使えば、shプロセスがコマンドプロセスに差し変わるので、sh -c プロセスが残らないはずです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
execコマンドを使って試してみます。

お礼日時:2010/02/26 01:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています