3

我在 Linux 中为 unix 和 win32(在每个构建时交叉编译)平台开发我的应用程序,所以一个现成的功能会很好:)。我正在使用具有该gchar* g_get_current_dir(void)功能的 glib 并返回当前目录,但我真正需要的是可执行文件的目录。我在 C 编程方面缺乏经验,因此欢迎任何建议。

4

3 回答 3

1

在具有该目录的 Unix 之类的操作系统下,即使没有此/proc目录,您也readlink /proc/self/exe可以获得实际的可执行文件完整路径argv[0]

fexecv但是,如果可执行文件是用启动的(在许多系统上不可用)并且在您的系统上作为系统调用实现, 这可能不起作用。fexecv就像execve它传递了一个打开的文件描述符而不是要运行的文件名。在 Linux 下,它是通过调用execve由 `"/proc/self/%i", fd" 生成的字符串来实现的,因此该文件必须在程序启动时存在于文件系统中。

我认为 GNU/Hurd 本身就支持fexecve

可执行文件在执行后可能会被重命名或从文件系统中取消链接,这使得它成为一个未命名的文件,一旦它停止打开就会消失(在这种情况下,运行文件通常需要它由内核打开)。

于 2010-06-11T17:20:52.530 回答
1

Windows 中的GetModuleFileName。 Linux中的argv [0]

注意:如果您进行跨平台编程,您还应该使用一些隐藏该层的跨平台库(Qt、wxWidgets、ACE、Boost [不知道,但我认为它有一些东西] ...)

于 2010-06-11T13:39:30.617 回答
0

我不能对窗户说话。但是在 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;
}
于 2010-06-11T13:53:10.150 回答