[英]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
/proc/PID/cmdline
包含用於執行程序的命令行(除非程序本身對其進行了修改)。 它不包含可執行文件的路徑。 它僅包含用於執行它的路徑。
例如,如果執行foo bar baz
,則其/proc/PID/cmdline
將包含foo\\0bar\\0baz\\0
。
您可以使用例如帶有'\\0'
getdelim()
作為分隔符來讀取可執行文件的路徑。
要獲取可執行文件的實際路徑,請檢查/proc/PID/exe
符號鏈接。 它將始終指向可執行文件。
要讀取符號鏈接,可以使用C庫提供的POSIX.1 readlink()
函數。
我在此答案中有一個示例實現。
在Linux中,有一個內核“錯誤”:如果可執行文件在文件系統層次結構中非常深,則對/proc/PID/exe
偽符號鏈接的readlink()
調用會失敗, ENAMETOOLONG
出現ENAMETOOLONG
錯誤。
可執行文件的路徑也可以從/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.