使用readlink函数作为解决scheme如何在C中find可执行文件的位置? ,我怎么会得到一个字符数组的path? 另外,buf和bufsize所代表的variables是什么,以及如何对它们进行初始化?
编辑:我正在尝试获取当前正在运行的程序的path,就像上面链接的问题。 这个问题的答案说使用readlink("proc/self/exe")
。 我不知道如何将其实施到我的程序中。 我试过了:
char buf[1024]; string var = readlink("/proc/self/exe", buf, bufsize);
这显然是不正确的。
这正确使用readlink
函数正确使用readlink
函数。
如果你有一个std::string
路径,你可以这样做:
#include <unistd.h> #include <limits.h> std::string do_readlink(std::string const& path) { char buff[PATH_MAX]; ssize_t len = ::readlink(path.c_str(), buff, sizeof(buff)-1); if (len != -1) { buff[len] = '\0'; return std::string(buff); } /* handle error condition */ }
如果你只是在一个固定的路径之后:
std::string get_selfpath() { char buff[PATH_MAX]; ssize_t len = ::readlink("/proc/self/exe", buff, sizeof(buff)-1); if (len != -1) { buff[len] = '\0'; return std::string(buff); } /* handle error condition */ }
要使用它:
int main() { std::string selfpath = get_selfpath(); std::cout << selfpath << std::endl; return 0; }
让我们看看这个manpage说的是什么:
readlink() places the contents of the symbolic link path in the buffer buf, which has size bufsiz. readlink does not append a NUL character to buf.
好。 应该很简单。 给你的1024个字符的缓冲区:
char buf[1024]; /* The manpage says it won't null terminate. Let's zero the buffer. */ memset(buf, 0, sizeof(buf)); /* Note we use sizeof(buf)-1 since we may need an extra char for NUL. */ if (readlink("/proc/self/exe", buf, sizeof(buf)-1) < 0) { /* There was an error... Perhaps the path does not exist * or the buffer is not big enough. errno has the details. */ perror("readlink"); return -1; }
char * readlink_malloc (const char *filename) { int size = 100; char *buffer = NULL; while (1) { buffer = (char *) xrealloc (buffer, size); int nchars = readlink (filename, buffer, size); if (nchars < 0) { free (buffer); return NULL; } if (nchars < size) return buffer; size *= 2; } }
取自: http : //www.delorie.com/gnu/docs/glibc/libc_279.html
接受的答案几乎是正确的,除非你不能依靠PATH_MAX,因为它是
如果系统没有这样的限制,则不保证按照POSIX来定义。
(来自readlink(2)手册页)
而且,当它被定义时,它并不总是表示“真实”的限制。 (请参阅http://insanecoding.blogspot.fr/2007/11/pathmax-simply-isnt.html )
readlink的联机帮助页也提供了在符号链接上执行该操作的方法:
使用静态大小的缓冲区可能无法为符号链接内容提供足够的空间。 缓冲区所需的大小可以通过调用链接上的lstat(2)返回的stat.st_size值来获得。 但是,应检查readlink()和read-linkat()写入的字节数,以确保符号链接的大小在调用之间不增加。
但是对于/ proc / self / exe /大多数/ proc文件,stat.st_size应该是0.我看到的唯一剩下的解决方案是在不适合的时候调整缓冲区的大小。
为了达到这个目的,我建议使用vector<char>
std::string get_selfpath() { std::vector<char> buf(400); ssize_t len; do { buf.resize(buf.size() + 100); len = ::readlink("/proc/self/exe", &(buf[0]), buf.size()); } while (buf.size() == len); if (len > 0) { buf[len] = '\0'; return (std::string(&(buf[0]))); } /* handle error */ return ""; }