我有一个'C'可执行文件c_out,它可以从两个不同的脚本scriptA和scriptB执行。有没有一种方法可以在c_out中找到哪个脚本执行了我?没有任何参数传递给c_out,但我想知道谁执行了c_out。从我的可执行文件调用
回答
下面是在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;
}
〜
这值得一些解释...然而, – CharlesB 2013-02-21 00:15:47
打开文件(在/ proc下)并且读取它会很容易;可能比使用'system'更有用。 – 2013-02-21 00:35:21
@CharlesB假设是该过程可以得到其父项PID并从中派生出一个名称/ cmdline。这不是100%,但可以在大多数情况下使用。可能有更好的解决方案。 – 2013-02-21 01:36:57
阅读/proc/../cmdline仅适用,如果脚本运行它自己的bash进程。
如果它包含在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;
}
由于它是一个正在执行的C可执行文件,因此没有被点击或来源的危险,是吗? – 2013-02-21 00:33:54
@JonathanLeffler调用可执行文件的脚本可能已经被找到。例如。当'script'调用程序并在bash提示符中键入'source script'时 – BeniBela 2013-02-21 00:35:23
我想你是对的,是技术性的;尽管我愿意争辩说,源自脚本的命令是执行脚本的命令,而不管它是否在源脚本中执行。除了设置环境变量以外,你多长时间采购一个脚本?我知道我基本上从不使用'source'(完全可以,但是我使用'.'来代替),除了设置环境。 YMMV,我猜。 – 2013-02-21 00:38:53
你可以尝试找出你的父进程的可执行文件的路径,但不是因为父母的可靠解决方案进程可能会在子进程之前终止,然后您的C进程将被转移到* nixes中的init
。或者父母可能会使用exec
替代孩子,然后就没有可靠的方法来找到它。
根据你试图解决什么问题,最简洁的方式可能是改变你的C程序的行为不同,而不是取决于谁在执行它,而是在environment或命令行参数。
- 1. 从JSP调用可执行文件
- 2. 无法从extensionscript .jsx文件调用可执行文件
- 3. 从Linux可执行文件
- 4. 从OS X上的NPAPI调用外部可执行文件?
- 5. 从C#调用Fortran可执行文件的进程
- 6. 如何从我的库中调用可执行文件中的函数?
- 7. 从ColdFusion应用程序调用Windows可执行文件(.exe)
- 8. 如何从Python脚本调用可执行文件?
- 9. Erlang:从beam可执行文件中调用rr(?MODULE)?
- 10. 无法从C++程序调用可执行文件
- 11. 我们如何可以调用CLI可执行文件的命令使用Python
- 12. 从可执行文件调用的C#程序集中访问App.Config文件
- 13. 什么可执行文件启动了我的可执行文件?
- 14. 从SQL Server运行可执行文件
- 15. 从makefile运行可执行文件2
- 16. 从makefile运行可执行文件
- 17. 从Matlab运行C可执行文件
- 18. 使用devenv调试C++可执行文件中的回调
- 19. Xcode调试 - 多个可执行文件
- 20. 可执行文件从cx_Freeze产生的
- 21. 从内核模式执行用户模式可执行文件
- 22. 我可以从InstallShield可执行文件获取ProductCode吗?
- 23. 我可以自动从PHP定位MySQL可执行文件吗?
- 24. 执行使用Powershell执行的C#可执行文件出错
- 25. 我想将可执行文件注入其他可执行文件
- 26. 可执行文件
- 27. 可执行文件
- 28. 在Visual Studio中调试由可执行文件调用的C++文件
- 29. 可能调用可执行文件无需调用thor的托管脚本?
- 30. 从我的项目在eclipse中创建可执行文件
不是直接。如果你可以改变一些东西,也许你可以做你想做的事情:包括命令行参数('c_out scriptB')或使用环境变量... – pmg 2013-02-20 23:33:25
你有一些合理的(如果是Linux的)答案,但一个更深的问题是:为什么你的可执行文件关心?我怀疑设计是否有缺陷,如果它必须根据哪个脚本调用它来做不同的事情。 scriptC执行它时会发生什么? – 2013-02-21 00:41:00