2017-01-14 53 views
0

我是一个没有经验的Linux程序员,并且正在尝试学习使用基于此question and answerreadlink()readlink将errno设置为ENOENT

我呼吁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; 
} 

输出:

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

事情(一种从自PID更改一次迭代例子)我曾尝试:

  • 编译后:sudo ./a.out(认为目录访问由于缺乏权限而受到限制)。结果:未改变的行为从./a.out
  • SIGINT程序执行期间,并验证/proc/<pid>/exe存在。结果:它对于程序的每次运行都一直存在。
  • 确认目标链接的值在499个字符以内。

有人可以帮忙找出问题吗?阅读readlink手册页和在线说明以及着名的StackOverflow文章,我仍然不清楚什么是错误的。

谢谢。

回答

3

proc/1234/exe是相对路径。

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


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


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

+0

我揍你了! –

+0

谢谢,我明白你的解释和我的错误了。 – StoneThrow

+1

@KeithThompson你的确做了约30秒,但我需要提出另外两个错误。 –

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是在你的家目录)。

+0

也谢谢。我讨厌在同一分钟内选择两个正确和慷慨的答案(SO只提供分钟分辨率(?))。但我会同时答复你的答案。 – StoneThrow

相关问题