是为了发出某些控制消息写进程或LWP控制文件 。控制消息(参看proc(1))包括stop/start消息,信号跟踪和控制,故障管理,执行控制(比如进入/退出某个系统调用时暂停)以及地址空间访问监视 。
迄今为止,我们讨论的都是用标准系统调用对procfs文件进行I/O操作,目前从
普通应用级程序员编程访问/proc文件来说这是唯一的办法 。然而另外有一组特定针对procfs的访问接口,proc(1)中介绍的/usr/proc/bin/下的命令(随Solaris分发)使用了这组接口 。这组接口位于libproc.so动态链接库,属于未公开的接口 。Sun公司正在着手准备关于这组接口的文档,做为标准Solaris APIs提供出来 。图5展示了以前讨论过的内核中procfs模块与各层之间的接口关系 。
--------------------------------------------------------------------------
--------------------- --------------------------
| custom /proc code | /usr/proc/bin/ |
------------------|-----------------------
| stdio interfaces | | |libproc|
------------------ -- -- -------------- |
| system calls || user
-----------------------------------------------------------------
--------------------------------------- | kernel
| vnode layer ||
--------------------------------------- --------
| procfs |
------------------------------------------------
图5. procfs模块与各层之间的接口关系
--------------------------------------------------------------------------
图5演示了多条到达procfs内核例程的路径 。开发者通常通过系统调用进入vnode层,这是前面过介绍的方式 。而proc(1)命令更多构建在libproc.so提供的接口上 。为什么需要这组动态链接库接口呢,提供一组简单易用的例程用于应用程序开发,减少直接使用内核机制带来的复杂性 。控制一个进程的执行,尤其是多线程进程,非常复杂,需要一组真正属于API层的编码接口,而不是内核层的编码接口 。
向控制文件的头8个字节(如果是LP64内核,就是头16个字节)写入一个操作码和
可选的操作数,完成进程控制 。写进程控制文件的路径也要经过vnode层,最终调用了procfs的prwritectl()函数 。允许在一次写调用中向控制文件写入多个控制消息(操作码和操作数),prwritectl()会将一次写入的多个控制消息分成独立的操作码/操作数对,顺序提交给内核的pr_control()函数,pr_control()函数将设置进程或LWP相应的标志,以指明控制机制启动,比如某一事件发生时暂停 。控制函数在proc(4)手册页中介绍 。
进程/LWP控制的实现与内核中进程/LWP子系统紧密结合,P区、U区、LWP和内核线程结构中各种域一起协作完成通过procfs进行的进程管理和控制 。建立进程控制包括设置标志和位掩码字段,用于跟踪那些导致进程、线程进入、离开内核的事件,包括信号、系统调用、故障情形 。对应这些事件的进入、离开内核的点定义得比较充分,为进程状态改变提供了自然的控制机制 。
系统调用、信号和故障分别对应数据类型sysset_t、sigset_t和fltset_t 。如果
指定发生某系统调用时暂停,此时尚未从进程读取提供给该系统调用的参数 。如果指定离开某系统调用时暂停,此时来自系统调用的返回值已经提交给进程 。可以指定发生某种故障时进入内核陷门处理程序 。可以指定接收到某个信号时暂停或者从系统调用、内核陷门处理程序返回,可以通过信号唤醒进程 。
可以在进程虚拟地址空间中指定一片区域处在监视中,当针对这片区域进行被监
视类型的操作(比如读、写访问),也就是监视事件发生时,产生一次监视点陷入,典型地导致进程、LWP暂停,这通过跟踪FLTWATCH故障或者捕捉非阻塞的SIGTRAP信号实现 。
推荐阅读
- Intel 平台版本 Solaris 8 安装指南 --6.故障排除
- 关于Solaris的syslog机制
- Solaris9的jumpstart服务器配置中文详解
- configure TCP Wrappers in Solaris 9
- SPARC/Solaris 8下快速终结TCP有限状态机的TIME_WAIT状态
- Solaris上的域名系统配置
- SUN Solaris 7重新安装手记
- SOLARIS+QMAIL+VPOPMAIL+IGENUS+QMAILAMDIN
- Solaris中的磁盘设备
- Solaris 的引导与初始化
