从我的可执行文件调用的地方

时间:2013-02-20 23:27:43

标签: c bash shell

我有一个'C'可执行文件c_out,它可以从两个不同的脚本scriptA和scriptB执行。有没有办法在c_out中找到哪个脚本执行了我?没有传递给c_out的参数,但我想找出谁执行了c_out。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

读取/proc/../cmdline只有在脚本运行时才有效。

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

实际脚本存储在bash变量BASH_SOURCE。

从c程序中读取并不是那么容易,但你可以使用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;
}

答案 2 :(得分:0)

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

根据您尝试解决的问题,最简洁的方法可能是更改您的C程序,使其行为不同,而不是取决于执行者,而是environment或命令行参数。