首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现readlink查找路径

如何实现readlink查找路径
EN

Stack Overflow用户
提问于 2011-04-03 04:29:30
回答 5查看 41.2K关注 0票数 26

使用readlink函数作为How do I find the location of the executable in C?的解决方案,如何将路径放入字符数组?另外,变量buf和bufsize代表什么,我如何初始化它们?

编辑:我正在尝试获取当前运行的程序的路径,就像上面链接的问题一样。这个问题的答案是使用readlink("proc/self/exe")。我不知道如何在我的程序中实现它。我试过了:

代码语言:javascript
复制
char buf[1024];  
string var = readlink("/proc/self/exe", buf, bufsize);  

这显然是不正确的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-03 04:38:18

Use the readlink() function properly用于正确使用readlink函数。

如果你在std::string中有自己的路径,你可以这样做:

代码语言:javascript
复制
#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 */
}

如果你只想要一条固定的路径:

代码语言:javascript
复制
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 */
}

要使用它:

代码语言:javascript
复制
int main()
{
  std::string selfpath = get_selfpath();
  std::cout << selfpath << std::endl;
  return 0;
}
票数 43
EN

Stack Overflow用户

发布于 2016-07-13 21:30:24

公认的答案几乎是正确的,除非您不能依赖PATH_MAX,因为它是

如果系统没有这样的限制,则不保证为每个POSIX定义

(来自readlink(2)手册页)

此外,当它被定义时,它并不总是代表“真实”的限制。(参见http://insanecoding.blogspot.fr/2007/11/pathmax-simply-isnt.html )

readlink的手册页还提供了在symlink上执行此操作的方法:

使用静态大小缓冲区的

可能无法为符号链接内容提供足够的空间。缓冲区所需的大小可以从链路上调用lstat(2)返回的stat.st_size值中获得。但是,应该检查readlink()和read- linkat()写入的字节数,以确保符号链接的大小不会在两次调用之间增加。

但是,对于大多数/proc文件,在/proc/self/exe/的情况下,stat.st_size将为0。我看到的唯一解决方案是在不适合的时候调整buffer的大小。

为此,我建议使用vector<char>,方法如下:

代码语言:javascript
复制
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 "";
}
票数 5
EN

Stack Overflow用户

发布于 2011-04-03 06:02:08

让我们来看看the manpage是怎么说的:

代码语言:javascript
复制
 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个字符的缓冲区:

代码语言:javascript
复制
 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;
 }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5525668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档