2

我有一个“C”可执行文件 c_out,它可以从两个不同的脚本 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

您可以尝试找出父进程的可执行路径,但这不是一个可靠的解决方案,因为父进程可能在子进程之前终止,然后您的 C 进程将被转移到init*nixes 中。或者父母可能会用exec孩子代替自己,然后就没有可靠的方法来找到它。

根据您尝试解决的问题,最干净的方法可能会更改您的 C 程序以使其行为不同,而不取决于执行它的人,而是取决于环境或命令行参数。

于 2013-02-21T00:31:57.270 回答
0

只有在脚本运行它自己的 bash 进程时,读取 /proc/../cmdline 才有效。

如果它包含在 中source script,它将打印调用脚本/shell。

实际脚本存储在 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 回答