我有一个“C”可执行文件 c_out,它可以从两个不同的脚本 scriptA 和 scriptB 执行。有没有办法在 c_out 中找出哪个脚本执行了我?没有传递给 c_out 的参数,但我想找出执行 c_out 的人。
问问题
177 次
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 回答