2009-06-03 8 views
3

Perlでは、スクリプトが別のスクリプト(おそらくsystemまたはqx経由)で実行されているかどうかを判断できますか?スクリプトがPerlのシステムコールまたはqxコール内で実行されているかどうかをどのように判断できますか?

$ cat foo.pl 
print "foo"; 
print "\n" if not $in_qx; # or the like. 

私はスクリプトがexec経由で実行されていた場合、これが適用されていません実現しています。

systemがプロセスをforkとして実行していることがわかりました。私はforkが親プロセスであるか子プロセスであるかによって可変の値を返すことができます。 qxについては不明です。

実際にforkを実行せずにfork処理中であるかどうかはわかりません。

+0

あなたはどのプラットフォームで実行していますか? –

+0

"標準" linux、特に特別なものはありません。 – Danny

+0

私が興味深いと思ったことは、あなたが親か子かに応じてforkがあなたに0か$ PIDを与えることです。私はこれを見るための簡単な方法があると思っていました。しかし、これまでのところ、最高の答えはクルージュのように見えます。 Unforunate、Owensは興味深い点がありますが、すべてのプロセスがフォークされていて、歩いていると木が気になることがあります。 – Danny

答えて

6

すべてのプロセスは、initを除く別のプロセスからforkされます。プログラムがopenqx//open2、またはopen3からPOSIXisatty関数を使用して実行されたかどうかを判断することはできますが、systemによって実行されているかどうかを判断する良い方法はありません。たとえそうであっても、それは暗くなる可能性があります(例えばsystem "nohup", "./foo.pl"は親として呼び出し側のプロセスを持っていません)。

2

発信者を制御していますか?最も簡単なことは、引数を渡すことです。 --isforked

+0

いいえ、実際はありません。私のスクリプトは別のスクリプトのラッパーとして機能していますが、実際には引数を変更することはできません。 – Danny

5

"getppid"(親IDを取得)を使用して "あなたのパパは誰ですか"にチェックできます。次に、親IDがpgrepなどのperlスクリプトであるかどうかを確認します。

+0

getppid(およびほとんどのget *関数)は、すべてのプラットフォームで実装されていません。たとえどこにいても、PIDがperlやシェルなどのインスタンスに属しているかどうかを判断する必要があります。 –

+0

彼はいくつかの標準的なLinuxで動いているので、これはおそらく問題ではありません。とにかくそれは何らかのかたまりですが、確かできれいなアプローチはありません。 – wazoox

関連する問題