某些情况下为了析取进程信息、进行进程控制,控制进程可能需要目标进程临时
完成某种特殊的操作 。例如,pfiles(1)命令可以列出目标进程打开的每个文件的信息,这需要目标进程针对每个打开的文件句柄做stat(2)系统调用 。运行在Solaris系统上的进程典型地花费大量时间阻塞在某个系统调用上,为了获得目标进程的控制权完成控制进程提交的任务,需要在目标进程阻塞时抢夺CPU,保护当前系统调用状态,当控制进程提交的任务完成后恢复保存的系统调用状态继续执行目标进程原来的任务 。
为了达到这个目的,procfs实现了另外一个代理LWP,而不是使用目标进程中现
有LWP,否则状态保存、恢复更加复杂 。procfs提供了一种机制创建代理LWP(注意PCAGENT控制消息) 。代理LWP创建成功后将是目标进程中唯一可运行LWP,直到它消亡 。
目标进程中执行代理LWP以完成控制进程提交的任务,比如在目标进程中执行系统调用 。然后销毁代理LWP,恢复保存的进程/LWP状态 。proc结构中有一个成员p_agenttp,指向创建的代理LWP 。内核代码通过检查该指针判断目标进程中是否存在代理LWP 。
kthread_t * p_agenttp; /* thread ptr for /proc agent lwp */
proc(4)手册页介绍了进程控制的更多细节 。
--------------------------------------------------------------------------
后记:
本篇与<>都是<>的一部分,由于很多东西缺乏内核Hacking经验和常用术语约定,翻译得相当牵强,好在可以对照/usr/include/下的头文件反复理解 。<<[805-3024] Solaris设备驱动程序编程指南>>和<<[805-4038] Solaris流编程指南>>是对理解<>很好的补充 。此外可以在comp.Unix.programmer和comp.unix.solaris上向Sun开发人员请教 。
推荐阅读
- 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 的引导与初始化