C 从那里调用我的可执行文件

C 从那里调用我的可执行文件,c,bash,shell,C,Bash,Shell,我有一个“C”可执行文件C_out,它可以从两个不同的脚本scriptA和scriptB执行。有没有办法让我在c_中找出哪个脚本执行了我?没有传递给c_out的参数,但我想知道是谁执行了c_out 这里有一个在Linux上快速确定这一点的方法 #include <stdio.h> int main(int argc, char* argv[]) { int ppid = 0; char syscmd[32]; ppid = getpp

我有一个“C”可执行文件C_out,它可以从两个不同的脚本scriptA和scriptB执行。有没有办法让我在c_中找出哪个脚本执行了我?没有传递给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;
}
#包括
int main(int argc,char*argv[])
{
int-ppid=0;
char-syscmd[32];
ppid=getppid();
sprintf(syscmd,“cat/proc/%d/cmdline\n”,ppid);
系统(syscmd);
返回0;
}

~

Reading/proc/./cmdline仅在脚本运行它自己的bash进程时起作用

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

实际脚本存储在bash变量bash_SOURCE中

从c程序中读取数据并不容易,但您可以使用gdb来完成

例如,在amd64上,始终打印调用脚本(即使是源代码脚本):

#包括
int main(int argc,char*argv[])
{
int-ppid=0;
char syscmd[256];
ppid=getppid();
sprintf(syscmd,“gdb-batch-ex\”附加%d\“-ex”打印*(*(*(((((((((char****))查找变量(\“BASH\u SOURCE\”)+1)+8)+2)+1)”\n”,ppid);
系统(syscmd);
返回0;
}

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


根据您试图解决的问题,最干净的方法可能是更改您的C程序,使其行为不同,这并不取决于执行程序的人,而是取决于或命令行参数。

不是直接的。如果你可以改变一些东西,也许你可以做你想做的事情:包括命令行参数(
c_out scriptB
)或使用环境变量……你已经得到了一些合理的(如果是面向Linux的)答案,但更深层次的问题是:为什么你的可执行文件会在意?我怀疑设计是有缺陷的,如果它必须根据调用它的脚本做不同的事情。当scriptC执行它时会发生什么?这值得一些解释+1然而,打开文件(在
/proc
下)并读取文件同样容易;可能比使用
system
@CharlesB更有用假设是进程可以获取其父PID并从中派生名称/cmdline。这不是100%,但在大多数情况下都有效。可能有更好的解决方案。@Jonathan是的,直接读取/proc/PID/cmdline更好,但此示例仅展示了它的工作原理。由于它是一个正在执行的C可执行文件,因此不会有被虚线或来源化的危险,是吗?@JonathanLeffler调用可执行文件的脚本可能已经来源化了。例如,当
script
调用程序时,您在bash prompt中键入
源脚本
,我想,在技术上您是对的;尽管我愿意争辩说,源代码脚本的命令就是执行它的命令,不管它是在源代码脚本中执行的。除了设置环境变量外,您多长时间生成一个脚本?我知道我基本上从不使用
源代码
(但我使用
),除了设置环境。我猜是YMMV。@JonathanLeffler:实际上bash可以自己找到它的来源。至少,如果脚本是可执行的,并且没有shebang,但只有一行程序调用,那么它将在同一进程中运行。
#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;
}