0

我是一个没有经验的 Linux 程序员,我正在尝试readlink()根据这个问题和答案来学习使用。

我的调用readlink()返回 -1 并设置errno为 2 ( ENOENT)。

编码:

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <iostream>
#include <algorithm>
#include <cstdio>

int main(int argc, char* argv[])
{
  char szTmp[100];
  snprintf(szTmp, 100, "proc/%d/exe", getpid());
  std::cout << "szTmp is " << szTmp << std::endl;
  char executingFolder[500];
  errno = 0;
  int bytes = std::min(readlink(szTmp, executingFolder, 500), (ssize_t)499);

  if (bytes > 0)
  {
    executingFolder[bytes] = '\0';
  }

  std::cout << "bytes is " << bytes << std::endl;
  std::cout << "errno is " << errno;
  if (ENOENT == errno)
  {
    std::cout << " ENOENT";
  }
  std::cout << std::endl;
  std::cout << "Executing folder is \"" << executingFolder << "\"" << std::endl;

  return 0;
}

输出:

(自 pid 更改以来的一次迭代示例)

szTmp is proc/22272/exe
bytes is -1
errno is 2 ENOENT
Executing folder is ""

我尝试过的事情:

  • 编译后:(sudo ./a.out认为由于缺少权限而限制了目录访问)。结果:行为不变./a.out
  • SIGINT 程序在执行期间,并验证/proc/<pid>/exe存在。结果:它在程序的每次运行中始终存在。
  • 验证目标链接的值在 499 个字符以内。

有人可以帮助确定问题吗?阅读了readlink手册页和在线描述,以及注意到的 StackOverflow 文章,我仍然不清楚出了什么问题。

谢谢你。

4

2 回答 2

3

proc/1234/exe是相对路径。

我想你想要/proc/%d/exe的,这是一个绝对路径,并且正确地引用了/proc目录。


其次,因为readlink()如果缓冲区太小会截断结果,你应该考虑返回值是== bufsiz错误的情况,因为截断可能已经发生。你不能知道。


此外,“执行文件夹”不是/proc/<pid>/exe给你的。/proc/<pid>/exe是当前运行的可执行文件(文件)的符号链接,而不是目录。

于 2017-01-14T02:47:14.877 回答
1

proc/22272/exe是一个相对路径名。它解析为当前exe目录中的文件、目录22272中、目录proc中。除非您的当前目录是,否则它不太可能存在。/

在这种情况下,您需要一个以 开头的绝对路径名。//proc/22272/exe

改变这个:

snprintf(szTmp, 100, "proc/%d/exe", getpid());

对此:

snprintf(szTmp, 100, "/proc/%d/exe", getpid());

但是在你修复你的程序之前,你可以试试这个:

( cd / ; ~/a.out )

(假设a.out在您的主目录中)。

于 2017-01-14T02:46:44.453 回答