7.fd目录fdinfo目录
fd目录包含了所有该进程使用的文件描述符,而fdinfo目录包含的是对应的fd目录中进程打开文件的操作权限。
|
我 们可以看出fd目录中包含的是进程打开文件的链接,这里我们就可以看到我们经常提到的标准输入(0),标准输出(1),标准错误输出(2)。那么 fdinfo中包含的文件的含义,我们可以从这两个方面探索。一个是内核中的 proc_fd_info函数(/fs/proc/base.c),fdinfo目录中的文件中的内容正是由这个函数写的,而flags对应的是文件结 构体(struct file)的f_flags域(知识我呢件的访问权限)。另一个是我们可以通过查看fd目录中包含的符号链接文件指向的文件的权限得知其(fdinfo目 录中文件内容)含义:
|
“flags:02″表示文件访问权限是O_RDWR(可读可写),而fd中符号链接文件指向的文件/dev/pts/5对用户的权限也是可读可写。
8.root符号链接文件该文件指向的是根目录(/)。9.stat文件该文件的内容反应的是该进程的PCB(task_struct结构)的一些数据域的信息。下面我们来具体看一下它的含义。首先我们在终端上启动gedit 程 序,然后使用系统监视器(gnome-system-monitor)查看gedit进程的pid为11942,然后我们读取它的stat文件
|
在内核中,该文件的内容由do_task_stat函数(fs/proc/array.c)写。主要操作是:
|
由以上解释我们可以知道该进程的pid为11942,可执行程序名为gedit,当前正处于睡眠状态,其父进程pid为7293,按理说应该是一个终端(因为我们是在终端上启动gedit的),那么我们来验证一下:
|
可 以看到pid等于7293的进程其可执行程序名的确是bash,所以它就是一个终端,并且是11942(gedit)的父进程。我们接着看11942号进 程。其所在线程组id为11942,会话组id都为7293,所以如果我们关闭pid为7293的终端,则11942号进程也会被关闭。它的tty终端下 启动的,所以终端设备号是一个有效值(如果是双击启动的,那么该项0,也就是说该程序不是在终端下启动的)。终端的进程组号为7293,该进程的 标志为4202496,对应十六进制为0×402000。对于进程的标志,内核定义在/include/linux/sched.h中,都已PF_开头 (process flags),0×402000=PF_RANDOMIZE | PF_USED_MATH,表示没有设置fpu的话,这个进程在使用任何变量之前都需初始化(PF_USED_MATH),并且该进程的虚拟地址空间是不 固定的(PF_RANDOMIZE )。接下来的4个(5017 0 0 0)是该进程的缺页管理的统计,说明该进程发生了5017次次缺页(次缺页:Copy on Write页和匿名页)(min_flt),并且其所有子进程没有发生次缺页(cmin_flt),没有发生主缺页(主缺页:从映射文件或交换设备 读入的页面数)(maj_flt),并且其所有子进程没有发生住缺页(cmaj_flt)。该进程在用户态下运行的时间是80个jiffies(在我的系 统中jiffies等于250,所以80个jiffies为20秒)(cputime_to_clock_t(utime)),该进程在内核态下运行的时 间是10个jiffies(2.5秒)(cputime_to_clock_t(stime)),该进程的所有子进程在用户态下运行的时间为 0(cputime_to_clock_t(cutime)),所有子进程在内核态下运行的时间为 0(cputime_to_clock_t(cstime))。该进程的动态优先级为20(priority),静态优先级为0(nice)。该进程所在 的线程组里的线程个数为1(num_threads)。接下来的一个”0″是直接输出的,没有含义。下面的1292037是该进程的的创建时间,说明该进 程的创建时间是开机后大约3.6小时时创建的(start_time=task->real_start_time,start_time/100 /3600=小时)。该进程的虚拟地址空间的大小是61636608B(),该进程当前主流物理内存空间的大小是4481B,能驻留物理地址空间的最大值 为4294967295B(4GB),在虚拟地址空间的代码段的起始地址是134512640(0×8048000,一般的应用程序虚拟地址空间的代码段 的起始地址都是0x80xxxxx,可以使用objdump -d查看),虚拟地址空间的代码段的结束地址是135099420(0x80D741C),虚拟地址空间的栈的起始地址是 3216990608(0xBFBF6190),堆栈指针的当前值为3216990068(0xBFBF5F74),可见我的系统的堆栈的扩展方向是向下 扩展(每压栈一个数,esp向下递减)。下一条要执行的指令的地址是3085931536(0xB7EF9410)。接下来的7个(0 0 4096 0 0 0 0 )是与信号有关的,内核注释说在这里已经没有作用,这里就不做解释。下面一个是进程退出时向父进程发送的信号,该出发送的信号为SIGCHLD(17)。 下来一个0表示该进程运行在第0个cpu上。该进程的实时程的相对优先级别为0,该进程是一个非实时进程。