2013-02-20 131 views
2

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

+0

不是直接。如果你可以改变一些东西,也许你可以做你想做的事情:包括命令行参数('c_out scriptB')或使用环境变量... – pmg 2013-02-20 23:33:25

+0

你有一些合理的(如果是Linux的)答案,但一个更深的问题是:为什么你的可执行文件关心?我怀疑设计是否有缺陷,如果它必须根据哪个脚本调用它来做不同的事情。 scriptC执行它时会发生什么? – 2013-02-21 00:41:00

回答

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; 
} 

+0

这值得一些解释...然而, – CharlesB 2013-02-21 00:15:47

+0

打开文件(在/ proc下)并且读取它会很容易;可能比使用'system'更有用。 – 2013-02-21 00:35:21

+0

@CharlesB假设是该过程可以得到其父项PID并从中派生出一个名称/ cmdline。这不是100%,但可以在大多数情况下使用。可能有更好的解决方案。 – 2013-02-21 01:36:57

0

阅读/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; 
} 
+0

由于它是一个正在执行的C可执行文件,因此没有被点击或来源的危险,是吗? – 2013-02-21 00:33:54

+0

@JonathanLeffler调用可执行文件的脚本可能已经被找到。例如。当'script'调用程序并在bash提示符中键入'source script'时 – BeniBela 2013-02-21 00:35:23

+0

我想你是对的,是技术性的;尽管我愿意争辩说,源自脚本的命令是执行脚本的命令,而不管它是否在源脚本中执行。除了设置环境变量以外,你多长时间采购一个脚本?我知道我基本上从不使用'source'(完全可以,但是我使用'.'来代替),除了设置环境。 YMMV,我猜。 – 2013-02-21 00:38:53

0

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

根据你试图解决什么问题,最简洁的方式可能是改变你的C程序的行为不同,而不是取决于谁在执行它,而是在environment或命令行参数。

相关问题