Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4238306
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2011-12-13 10:04:53

本文是根据 kerneltravel proc文件系统探索系列
学习,具体实际操作的记录

===============================================
2. cwd目录链接
目录链接指向该进程运行的当前路径。该符号链接虽然使用ls命令查看其权限是对所有用户都有权限,但实际上是只用启动该进程的用户才具有读写的权限,其他用户不具有一切权限。该链接指向该进程运行的当前路径看,例如我们在用户目录下启动该进程,那么cwd就指向用户目录。
  1. ywx@ywx:~/Desktop/proc$ ls
  2. hello  hello.c  readcmd  readcmd.c
  3. ywx@ywx:~/Desktop/proc$ ./hello one two
  4. hello world

  5. ywx@ywx:~/desktop$ ps -A | grep hello
  6.  3593 pts/1 00:00:00 hello
  7. ywx@ywx:~/desktop$ cd /proc/3593
  8. ywx@ywx:/proc/3593$ cd cwd
  9. ywx@ywx:/proc/3593/cwd$ ls
  10. hello hello.c readcmd readcmd.c hello这个进程程序在/home/ywx/desktop/proc/下面
  11. ywx@ywx:/proc/3593/cwd$

3.environ文件
包含该进程运行的环境变量。我们常用一些环境变量都包含在该文件中,例如PATH、HOME、PWD等。所以如果我们想在一个进程中获取这些环境变量而又不想使用getenv(),getpwd等函数的时候,我们就可以直接读取该进程的该文件以直接获得环境变量。下面是一个程序实现这个过程:
  1. ywx@ywx:~/Desktop/proc$ cat environ.c
  2. #include <stdio.h>
  3. #include <unistd.h> //unix stdard getpid()
  4. #include <string.h> //
  5. int main(int argc, char *argv[])
  6. {
  7.     FILE *fp;
  8.     int pid;
  9.     char path[80];
  10.     int i = 0;
  11.     unsigned char buff[1024*3];
  12.     unsigned char *p = NULL;
  13.     unsigned char ch;
  14.     if(argc < 2)
  15.     {
  16.         printf("no argument\n");
  17.         return 0;
  18.     }
  19.     pid = getpid();
  20.     snprintf(path,80,"/proc/%d/environ",pid);//格式输入数据
  21.     if((fp = fopen(path,"r")) == NULL)
  22.     {
  23.         perror("fopen");
  24.         return 0;
  25.     }
  26.     while(!feof(fp))
  27.     {
  28.         if((ch=fgetc(fp))!='\0')//从environ文件中得到数据,存储在buff中
  29.         {    
  30.             buff[i]=ch;
  31.             i++;
  32.             continue;
  33.         }
  34.         buff[i]='\0';
  35. //从字符串buffe中寻找argv[1]第一次出现的位置,没找到,返回NULL
  36.         if((p=strstr(buff,argv[1])) != NULL)//not find return NULL
  37.         {
  38.             printf("%s\n",p+strlen(argv[1]+1));//找到,打印信息
  39.         }
  40.         i = 0;
  41.         memset(buff,'\0',1024*3);
  42.     }
  43.     fclose(fp);
  44.     return 0;
  45. }
ywx@ywx:~/desktop/proc$ gcc environ.c -o environ
ywx@ywx:~/desktop/proc$ ./environ HOME
E=/home/ywx
ywx@ywx:~/desktop/proc$ ./environ PWD
D=/home/ywx/desktop/proc
D=/proc/3542
ywx@ywx:~/desktop/proc$ 


4. exe链接文件
指向该进程相应的可执行文件。从这里我们可以看到该进程的可执行文件路径。
我们这里使用cwd目录链接 中hello程序
  1. ywx@ywx:/proc$ ps -A | grep hello
  2.  4251 pts/1 00:00:00 hello
  3. ywx@ywx:/proc$ sudo ls -l /proc/4251/exe
  4. lrwxrwxrwx 1 ywx ywx 0 2011-12-13 11:08 /proc/4251/exe -> /home/ywx/Desktop/proc/hello
  5. ywx@ywx:/proc$

5.maps文件和smaps文件
maps文件是可执行文件或者库文件对应的内存映像,而smpas文件显示的是该进程这些可执行文件或库文件内存映像在内存中的大小等信息。
  1. ywx@ywx:/proc/1500$ sudo cat maps | more
  2. 00110000-00112000 r-xp 00000000 08:01 1575226 /usr/lib/libgmodule-2.0.so.0.2600.1 代码段
  3. 00112000-00113000 r--p 00002000 08:01 1575226 /usr/lib/libgmodule-2.0.so.0.2600.1 看不出来
  4. 00113000-00114000 rw-p 00003000 08:01 1575226 /usr/lib/libgmodule-2.0.so.0.2600.1 数据段
  5. 00114000-00117000 r-xp 00000000 08:01 1575228 /usr/lib/libgthread-2.0.so.0.2600.1
  6. 00117000-00118000 r--p 00003000 08:01 1575228 /usr/lib/libgthread-2.0.so.0.2600.1
  7. 00118000-00119000 rw-p 00004000 08:01 1575228 /usr/lib/libgthread-2.0.so.0.2600.1
  8. 00119000-00131000 r-xp 00000000 08:01 1576735 /usr/lib/libxcb.so.1.1.0
  9. 00131000-00132000 r--p 00017000 08:01 1576735 /usr/lib/libxcb.so.1.1.0
  10. 00132000-00133000 rw-p 00018000 08:01 1576735 /usr/lib/libxcb.so.1.1.0
我们可以看到pid等于1500的进程的内存映像。其中从00110000-00112000 是  /libgmoudle-2.0.so.2600.1的内存映像 ,骑在虚拟内存中的偏移是0x000000 ,该文件的inode是1575226,其访问标志是 r-xp,即可读、执行、私有的。我们可以猜出此为/libgmoudle的程序段。其中00112000-00113000  也是内存映射,r--p 表示:可读、私有的。其中00113000-00114000  也是内存映射,rw-p 是数据段。
08:01 表示的是文件所在设备的设备号  08 表示是主设备号,01 表示次设备号。这里的08 cat /proc/devices 显示是表示 8 sd   设备类型标号参考/linux/Documention/devices.txt文件。  所以我们得知此设备是/dev/sd1 。                        
查看smaps的内容
  1. ywx@ywx:/proc/1500$ sudo cat smaps | more
  2. 00110000-00112000 r-xp 00000000 08:01 1575226 /usr/lib/libgmodule-2.0.so.0.2600.1
  3. Size: 8 kB
  4. Rss: 8 kB
  5. Pss: 0 kB
  6. Shared_Clean: 8 kB
  7. Shared_Dirty: 0 kB
  8. Private_Clean: 0 kB
  9. Private_Dirty: 0 kB
  10. Referenced: 8 kB
  11. Swap: 0 kB
  12. KernelPageSize: 4 kB
  13. MMUPageSize: 4 kB
我们可以看到其显示的信息比maps文件更详细。对于内存映像的每一个段它都列出该段的详细信息,如大小等。我们可以结合这两个文件获取该进程的完整的内存映像信息。























































阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~