2017-01-14 51 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

相關問題