我有一个'C'可执行文件c_out,它可以从两个不同的脚本scriptA和scriptB执行。有没有办法在c_out中找到哪个脚本执行了我?没有传递给c_out的参数,但我想找出谁执行了c_out。
答案 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或命令行参数。