proc文件系統探索 之 以數字命名的目錄[一]



在proc根目錄下以數字命名的目錄表示當前一個運行的進程目錄名即爲進程的pid。其內的目錄和文件給出了一些關於該進程的信息。


niutao@niutao-desktop:/proc/6584$ ls
attr        coredump_filter  fd        maps        oom_score  statm
auxv        cpuset           fdinfo    mem         root       status
cgroup      cwd              io        mounts      sched      task
clear_refs  environ          limits    mountstats  smaps      wchan
cmdline     exe              loginuid  oom_adj     stat

我們可以看到該目錄下有這麼些文件。其中attr、fd、fdinfo、task爲目錄cwd、root爲指向目錄的鏈接exe爲指向文件的鏈 接其餘爲一般的文件。對於一些文件或目錄操縱的權限(查看或者修改的權限)是該進程的創建者纔有例如auxv、envion、fd、fdinfo、 limits、mem、mountstats等文件或目錄只有創建該進程的用戶才具有查看或者進入的權限而其他一些文件則對所有用戶具有可讀權限。關於 這些文件或目錄的權限我們可以在內核中找到(fs/proc/base.c tid_base_stuff數組)。下我們來詳細探討每一個文件或目錄的作用.
1cmdline文件
該文件中包含的是該進程的命令行參數包括進程的啓動路徑(argv[0])。也就是說例如你在命令行上運行一個hello程序:

niutao@niutao-desktop:~$ cat hello.c
#include<stdio.h>
#include<wait.h>
int main()
{
int i;
for(i=0;i<100;i++) {
printf("Hello world\n");
sleep(2);
}
return 0;
}
niutao@niutao-desktop:~$ gcc -o hello hello.c
niutao@niutao-desktop:~$ ./hello one two
niutao@niutao-desktop:~$ ps -A |grep hello
7282 pts/4 00:00:00 hello
niutao@niutao-desktop:~$ cd /proc/7282/
niutao@niutao-desktop:/proc/7282$ cat cmdline
./helloonetwoniutao@niutao-desktop:/proc/7282$

可以看到cmdline裏的內容爲”./helloonetwo”正是命令行的參數。可能你會疑問爲什幺參數沒有分開呵呵那是因爲cat欺騙了你。我們可以做一個實驗將該cmdline文件複製到你的用戶目錄下如果使用vim查看就會發現是這樣:
./hello^@one^@two^@
也就是說實際每個參數之間是有東西隔開的之不過cat將其忽略了而已而vim可以給你標識出有東西但vim本身不可顯示罷了。我們可以通過編程讀取該文件。下面給出我寫的一個讀取該文件的小程序。
我們一個字符一個字符的讀取文件內容直到文件結束在讀取沒一個字符的時候打印其字符和對應的數值

niutao@niutao-desktop:~/c$ cat readcmd.c
#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int args,char *argv[])
{
FILE *fp;
char path[80];
unsigned char ch;
snprintf(path,80,"/home/niutao/cmdline");
if((fp=fopen(path,"r"))==NULL)
{
perror("fopen");
return 0;
}
while(!feof(fp)) {
ch=fgetc(fp);
printf("%c %d\n",ch,ch);
}
fclose(fp);
return 0;
}
niutao@niutao-desktop:~/c$ gcc -o readcmd readcmd.c
niutao@niutao-desktop:~/c$ ./readcmd
. 46
/ 47
h 104
e 101
l 108
l 108
o 111
0
o 111
n 110
e 101
0
t 116
w 119
o 111
0
255

niutao@niutao-desktop:~/c$

由此我們可以看出並非是每個參數之間沒有間隔而已以字符’\0′作間隔。所以如果我們在某一程序中想讀取某個進程的命令行參數我們只需要知道該進程的pid然後進入proc文件系統的該pid對應的目錄下編程讀取cmdline文件就可以了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章