我是一个没有经验的 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 文章,我仍然不清楚出了什么问题。
谢谢你。