2012-04-28 37 views

回答

12

在标准C和glibc,你已经ARGV [0]:

int main (int argc, char *argv[]) 

的第一元件argv数组是程序名称。

但是,它自己并不足以确定可执行文件的确切位置。参数实际上是由运行程序的程序设置的 - 无论是shell还是窗口管理器 - 它们都不是非常有用。如果你的程序是在路径和你

your_program

在bash shell中只需运行该程序,然后在“your_program”是您将argv中获取[0]。

对于完整的可执行文件路径,linux有/proc filesystem。在/proc下,每个正在运行的进程都会获得自己的“目录”,并以其进程ID命名。运行过程也可以在/proc/self下看到自己的子树。每个进程获得的文件之一是/proc/[pid]/exe,这是与进程正在运行的实际可执行文件的符号链接。

这样你就可以得到这样的实际完全可执行文件的路径:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) { 
    char exe[1024]; 
    int ret; 

    ret = readlink("/proc/self/exe",exe,sizeof(exe)-1); 
    if(ret ==-1) { 
     fprintf(stderr,"ERRORRRRR\n"); 
     exit(1); 
    } 
    exe[ret] = 0; 
    printf("I am %s\n",exe); 
} 

您可能还可以直接传递到/proc/[pid]/exeaddr2line()

+1

太棒了!这是完美的 – lurscher 2012-04-28 16:47:06

+0

在这种情况下,使用'/ proc/self/exe'更容易,因此不需要getpid()调用。 – Diego 2013-12-13 16:16:37

5

可以访问的argv [0],但无实际变量的引用,通过在glibc的使用保存指针:https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

实例:

extern const char *__progname; 

int print_progname() 
{ 
    return puts(__progname); 
} 

的argv [0]不一定反映尽管用来调用该程序的名称。 见man 2 execve and man 7 environ欲了解更多信息。

相关问题