Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取正在执行的程序&x27;使用与平台无关的方法在C中创建s目录?_C_Cross Compiling_Glibc_Glib - Fatal编程技术网

如何获取正在执行的程序&x27;使用与平台无关的方法在C中创建s目录?

如何获取正在执行的程序&x27;使用与平台无关的方法在C中创建s目录?,c,cross-compiling,glibc,glib,C,Cross Compiling,Glibc,Glib,我在Linux中为unix和win32(每次构建时交叉编译)平台开发我的应用程序,所以一个随时可用的函数很好:)。我使用的glib具有gchar*g\u get\u current\u dir(void)函数,它返回当前目录,但我真正需要的是可执行文件的目录。我对C编程没有经验,所以欢迎您提出任何建议。在Windows中。 在linux中 注意:如果您进行跨平台编程,您还应该使用一些隐藏此层的跨平台库(Qt、wxWidgets、ACE、Boost[不知道,但我认为它有什么]…)我无法与windo

我在Linux中为unix和win32(每次构建时交叉编译)平台开发我的应用程序,所以一个随时可用的函数很好:)。我使用的glib具有
gchar*g\u get\u current\u dir(void)
函数,它返回当前目录,但我真正需要的是可执行文件的目录。我对C编程没有经验,所以欢迎您提出任何建议。

在Windows中。 在linux中


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

我无法与windows对话。然而,在UNIX中,有相当比例的时间是可能的,但不能保证。这样做的原因包括从其他程序(如shell)调用exec,在某些情况下,这些程序可以对可执行文件所在的位置进行云计算,例如,“../../../mybin/exe/myprogram”之类的相对路径。PATH变量还使跟踪可执行文件变得有趣

让我问:你想做什么,或者更准确地说,你为什么需要知道? 在我看来,你不需要知道。您可以检查getcwd(),如果您没有在有效的目录中运行,请退出。可执行映像位于何处并不重要

这里有一个代码帅哥,大部分时间都能工作,但并不总是如此

需要从main调用,使用argv[0],我使用popen()调用shell以使代码适合小型are,popen()并不总是一个很好的选择,如果路径前面有其他同名的可执行文件,这可能会失败:

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;
}

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

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

我认为GNU/Hurd在本地支持
fexecve


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

大量重复,例如-1:
argv[0]
不是在*nix中获取路径的有用或可靠的方法。你知道我可以使用哪些库来抽象它吗?正如我所说的,我已经在使用glib了,但我没有找到任何现成的函数来获取可执行文件的路径path@Iulian:
*nix
表示Linux、Unix或任何其他类似Unix的操作系统-
argv[0]
可以仅包含可执行文件的名称、可执行文件的相对路径或完整路径、空字符串或其他任何内容,具体取决于可执行文件的启动方式。您不应该依赖它。您可以使用
execv(3)将
argv[0]
设置为任何您想要的内容
所以它不可靠。@Paul,@cjg你是对的。我挖了一点,现在我可以确认argv[0]没有我想象的那么安全。谢谢!结合这一点和#ifdefs预处理器条件,我想我可以自己解决其余的问题,谢谢。