我在 Linux 中为 unix 和 win32(在每个构建时交叉编译)平台开发我的应用程序,所以一个现成的功能会很好:)。我正在使用具有该gchar* g_get_current_dir(void)
功能的 glib 并返回当前目录,但我真正需要的是可执行文件的目录。我在 C 编程方面缺乏经验,因此欢迎任何建议。
3 回答
在具有该目录的 Unix 之类的操作系统下,即使没有此/proc
目录,您也readlink
/proc/self/exe
可以获得实际的可执行文件完整路径argv[0]
。
fexecv
但是,如果可执行文件是用启动的(在许多系统上不可用)并且在您的系统上作为系统调用实现, 这可能不起作用。fexecv
就像execve
它传递了一个打开的文件描述符而不是要运行的文件名。在 Linux 下,它是通过调用execve
由 `"/proc/self/%i", fd" 生成的字符串来实现的,因此该文件必须在程序启动时存在于文件系统中。
我认为 GNU/Hurd 本身就支持fexecve
。
可执行文件在执行后可能会被重命名或从文件系统中取消链接,这使得它成为一个未命名的文件,一旦它停止打开就会消失(在这种情况下,运行文件通常需要它由内核打开)。
Windows 中的GetModuleFileName。 Linux中的argv [0]
注意:如果您进行跨平台编程,您还应该使用一些隐藏该层的跨平台库(Qt、wxWidgets、ACE、Boost [不知道,但我认为它有一些东西] ...)
我不能对窗户说话。但是在 UNIX 中,有相当比例的时间是可能的,但不能保证。造成这种情况的原因涉及从其他程序(如 shell)调用 exec,在某些情况下,这可能会使可执行文件所在的位置变得模糊,例如“../../../mybin/exe/myprogram”之类的相对路径。PATH 变量还使跟踪可执行文件变得有趣。
让我问:你想做什么,或者更准确地说,你为什么需要知道?海事组织你不需要知道。您可以检查 getcwd() 如果您没有在有效的目录中运行,请退出。您的可执行映像所在的位置无关紧要。
这是一个大部分时间都有效的代码块,但并非总是如此!
需要从 main 调用,使用 argv[0],我正在使用对 shell 的 popen() 调用来使代码适合一个小区域,popen() 并不总是一个很好的选择,如果之前有其他可执行文件,这可能会失败在具有相同名称的 PATH 中:
char *
mypath(const char *src)
{
FILE *cmd=NULL;
static char path_2_me[PATH_MAX]={0x0};
char tmp[PATH_MAX]={0x0};
const char *basename=strrchr(src, '/');
if(basename==NULL)
basename=src;
else
basename++;
if(memcmp(src, "./", 2)==0)
sprintf(path_2_me,"%s/%s", getcwd(tmp, PATH_MAX), basename);
else
{
sprintf(tmp, "/usr/bin/which %s", basename);
cmd=popen(tmp, "r");
fgets(path_2_me, sizeof(path_2_me), cmd); /* one read only */
pclose(cmd);
/* check for what your version of which says on failure */
if(memcmp(path_2_me, "no ", 3)==0)
*path_2_me=0x0;
}
return (*path_2_me) ?path_2_me: NULL;
}