2

「C」実行可能ファイル c_out があり、2 つの異なるスクリプト scriptA と scriptB から実行できます。c_out でどのスクリプトが実行されたかを調べる方法はありますか? c_out に渡される引数はありませんが、誰が c_out を実行したかを知りたいです。

4

3 に答える 3

3

Linux でこれを判断する簡単な方法を次に示します。

#include <stdio.h>

int main(int argc, char* argv[])
{
        int ppid = 0;
        char syscmd[32];
        ppid = getppid();
        sprintf(syscmd,"cat /proc/%d/cmdline\n",ppid);
        system(syscmd);
        return 0;
}

于 2013-02-20T23:57:16.430 に答える
0

/proc/../cmdline の読み取りは、スクリプトが独自の bash プロセスで実行されている場合にのみ機能します。

に含まれていた場合はsource script、呼び出し元のスクリプト/シェルを出力します。

実際のスクリプトは、bash 変数 BASH_SOURCE に格納されます。

ac プログラムから読み取るのはそれほど簡単ではありませんが、gdb を使用して読み取ることができます。

たとえば、amd64 では、これは常に呼び出しスクリプトを出力します (ソースからのスクリプトであっても):

#include <stdio.h>

int main(int argc, char* argv[])
{
    int ppid = 0;
    char syscmd[256];
    ppid = getppid();
    sprintf(syscmd,"gdb --batch -ex \"attach %d\" -ex 'print *(*((*((char****)find_variable(\"BASH_SOURCE\") + 1) + 8) + 2) + 1)'\n",ppid);
    system(syscmd);
    return 0;
}
于 2013-02-21T00:29:45.117 に答える
0

親プロセスの実行可能パスを見つけようとすることはできますが、親プロセスが子プロセスの前に終了し、C プロセスがinit*nixes に転送される可能性があるため、これは信頼できる解決策ではありません。または、親がexec自分自身を子で置き換えるために使用する可能性があり、それを見つけるための信頼できる方法はありません.

解決しようとしている問題に応じて、最もクリーンな方法は、Cプログラムを実行している人ではなく、環境またはコマンドライン引数に応じて異なる動作をするように変更することです。

于 2013-02-21T00:31:57.270 に答える