簡體   English   中英

C從/ proc中的文件中提取信息

[英]C extracting info from file in /proc

我試圖從C中的/ proc / pid / cmdline獲取包含PID可執行文件的路徑。手冊頁指出:

“命令行參數在此文件中顯示為一組由空字節('\\ 0')分隔的字符串,最后一個字符串后還有一個空字節。”

我的想法(偽代碼):

int main(int argc, char** argv){
    // Assume file_path has been initialized
    char executable_path[1000];
    FILE* file = fopen(file_path, "r");
    if(f != NULL){

        fscanf("%s", executable_path);
    }
    return 0;
}

由於我只想要該文件中的第一個字符串(因為它是包含可執行文件的路徑),並且我確定在第一個字符串之后有一個'\\ 0',因此fscanf是使用的正確函數嗎? 它會檢測到第一個“ \\ 0”,然后將整個字符串存儲到可執行文件路徑數組中的第一個“ \\ 0”嗎? (注意:我不需要提取其他任何字符串)。

謝謝!

不要為此使用fscanf ,如果命令名稱中包含空格,則不會獲得全名。

您可以使用fgets ,它將在'\\0'處停止讀取。 我現在有一個運行於pid 10979的進程:

FILE *fp = fopen("/proc/10979/cmdline", "r");

char line[1024];
fgets(line, sizeof line, fp);

puts(line);

fclose(fp);

打印:

/usr/bin/gvim
  1. /proc/PID/cmdline包含用於執行程序的命令行(除非程序本身對其進行了修改)。 它不包含可執行文件的路徑。 它僅包含用於執行它的路徑。

    例如,如果執行foo bar baz ,則其/proc/PID/cmdline將包含foo\\0bar\\0baz\\0

    您可以使用例如帶有'\\0' getdelim()作為分隔符來讀取可執行文件的路徑。

  2. 要獲取可執行文件的實際路徑,請檢查/proc/PID/exe符號鏈接。 它將始終指向可執行文件。

    要讀取符號鏈接,可以使用C庫提供的POSIX.1 readlink()函數。

    在此答案中有一個示例實現。

    在Linux中,有一個內核“錯誤”:如果可執行文件在文件系統層次結構中非常深,則對/proc/PID/exe偽符號鏈接的readlink()調用會失敗, ENAMETOOLONG出現ENAMETOOLONG錯誤。

  3. 可執行文件的路徑也可以從/proc/PID/stat提取。

    可執行文件的名稱在該偽文件的第一個(和最后一個)之間。

    您可以使用getline()讀取整個行(整個偽文件,實際上,因為它只含有在后面的新行), strchr()來定位第一(在里面,而strrchr()查找最后)

如果您想嘗試有趣/討厭的可執行文件名稱,只需運行例如

ln -s /bin/cat $'foo)\nbar\n('
$'./foo)\nbar\n(' /proc/self/stat
rm $'foo)\nbar\n('

在Bash中,並檢查/proc/self/stat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM