如何在C语言中获取程序位置

如何在C语言中获取程序位置,c,C,你知道如何在C语言中获得当前程序的绝对位置吗?我说的不是当前目录,而是可执行文件所在的目录。据我所知,C标准没有定义这样做的方法。唯一的方法是使用依赖于操作系统的函数,这意味着您可以在Linux/Windows/Mac中使用,而不是“在C中” 一种方法是获取可执行文件的文件名,该文件名通常位于argv[0]中。但我不确定假设它是可执行文件的完整路径是否总是安全的 例如,在BusyBox中,他们使用符号链接使单个可执行文件显示为多个单独的程序。可执行文件检查argv[0]是什么,并相应地进行操作。

你知道如何在C语言中获得当前程序的绝对位置吗?我说的不是当前目录,而是可执行文件所在的目录。

据我所知,C标准没有定义这样做的方法。唯一的方法是使用依赖于操作系统的函数,这意味着您可以在Linux/Windows/Mac中使用,而不是“在C中”

一种方法是获取可执行文件的文件名,该文件名通常位于
argv[0]
中。但我不确定假设它是可执行文件的完整路径是否总是安全的


例如,在BusyBox中,他们使用符号链接使单个可执行文件显示为多个单独的程序。可执行文件检查argv[0]是什么,并相应地进行操作。

据我所知,C标准没有定义一种方法来实现这一点。唯一的方法是使用依赖于操作系统的函数,这意味着您可以在Linux/Windows/Mac中使用,而不是“在C中”

一种方法是获取可执行文件的文件名,该文件名通常位于
argv[0]
中。但我不确定假设它是可执行文件的完整路径是否总是安全的


例如,在BusyBox中,他们使用符号链接使单个可执行文件显示为多个单独的程序。可执行文件检查什么是argv[0],并相应地进行操作。

您可以查看argv[0],但我不确定它是否保证为您提供路径。

您可以查看argv[0],但我不确定它是否保证为您提供路径。

C标准没有提供这样做的方法;它必须使用特定于操作系统的API来完成。你也可以在芯片上直接编程一个微型嵌入式操作系统;那么,计划的地点是什么


在普通操作系统上,我认为这可能是一个安全漏洞。

C标准并没有提供一种方法;它必须使用特定于操作系统的API来完成。你也可以在芯片上直接编程一个微型嵌入式操作系统;那么,计划的地点是什么


在普通操作系统上,我认为这可能是一个安全漏洞。

在Linux中使用
readlink/proc/self/exe


在Windows中使用带有say
hModule=NULL的
GetModuleFileName()
在Linux中使用
readlink/proc/self/exe



在Windows中,使用
GetModuleFileName()
和say
hModule=NULL

是否指放置可执行文件的目录?是的。可执行文件路径也很好。哪个操作系统?我觉得这可能与操作系统有关,因为我不认为C标准要求程序必须从文件运行。如果他说的是Windows,则只有一个副本。你是指可执行文件所在的目录吗?是的。可执行路径也很好。哪个操作系统?我觉得这可能取决于操作系统,因为我不认为C标准要求程序必须从文件运行。如果他说的是WindowsNope,它会在执行时显示可执行文件(即,如果你执行了
/a.out-foo bar
,那么
argv[0]
is
/a.out
不,它在执行时显示可执行文件(即,如果您执行了
/a.out-foo bar
,那么
argv[0]
is
/a.out
我不认为C标准说“您无法获得可执行文件的完整路径”。我建议将其重新表述为“这只可能使用依赖操作系统的API”。至于“那么,程序位置是什么”:嵌入式系统通常只使用
int main(void)
。@H2CO3谢谢,更正了。我不认为C标准说“你无法获得可执行文件的完整路径”。我建议将其重新表述为“这只可能使用依赖操作系统的API”。至于“那么,程序位置是什么呢?”“:嵌入式系统通常只使用
int main(void)
。@H2CO3谢谢,更正。+1显示实际解决方案比说“不可能”(显然不是)要好得多。+1显示实际解决方案比说“不可能”(显然不是)要好得多。”.@nouney在windows 7 x86上存储可执行文件的全名。你自己试试。我有MSVC2005。@kvv好我的坏!nouney我也不知道,所以没关系。@nouney在windows 7 x86上存储可执行文件的全名。你自己试试。我有MSVC2005。@kvv好我的坏!nouney我也不知道,所以没关系。