如何获取正在执行的程序&x27;使用与平台无关的方法在C中创建s目录?
我在Linux中为unix和win32(每次构建时交叉编译)平台开发我的应用程序,所以一个随时可用的函数很好:)。我使用的glib具有如何获取正在执行的程序&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
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预处理器条件,我想我可以自己解决其余的问题,谢谢。