理解/proc文件系统( 三 )



void getInfo ( int fd, int pid )
{
prpsinfo_t prp;
prstatus_t prs;

if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )
{
perror( "ioctl" );
exit( 5 );
}
if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )
{
perror( "ioctl" );
exit( 7 );
}
if ( counter > 9 )
{
fprintf( stdout, "PIDtIMAGEttRSSttHEAPttSTACKn" );
counter = 0;
}
fprintf( stdout, "\ut%-9ut%-9ut%-15ut%-15un", pid,
( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,
( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );
counter;
} /* end of getInfo */
--------------------------------------------------------------------------

译者: 作者这里利用了ioctl(),而不是直接读取/proc下文件,这样做的好处在于即使系统升级后/proc布局改变,内核中相应ioctl cmd支持也随之改变,对于应用层的开发者,接口一样,源代码可平稳移植 。事实上从作者前面举例来看, memlook.c是在Solaris 2.6以前的版本上开发的,但我并未修改就可以直接用在Solaris 2.6上,虽然此时/proc布局已经发生重大变化 。

仔细阅读prstatus和prpsinfo结构,寻找那些你敢兴趣的成员 。在未能真正掌握这种技术之前不要针对/proc文件系统使用write()或者ioctl() 。针对特定进程胡乱做write()调用,结果未知 。

◆ 结论

当痛苦调试程序或者试图获取指定进程状态的时候,/proc文件系统将是你强有力的支持者 。通过它可以创建更强大的工具,获取更多信息 。

推荐阅读