gpt4 book ai didi

c++ - readlink 将 errno 设置为 ENOENT

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:04 26 4
gpt4 key购买 nike

我是一个没有经验的 Linux 程序员,正在努力学习使用 readlink()基于此 question and answer .

我调用 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 文章,我仍然不清楚哪里出了问题。

谢谢。

最佳答案

proc/1234/exe是相对路径。

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


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


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

关于c++ - readlink 将 errno 设置为 ENOENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41646275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com