日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

理解/proc文件系統(tǒng)( 二 )


Current rlimit: 64 file descriptors
0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
3: S_IFDOOR mode:0444 dev:191,0 ino:1618164880 uid:0 gid:0 size:0
O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[213]
63: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR FD_CLOEXEC
[scz@ /export/home/scz]>

圖B: 使用pfiles(1)命令

--------------------------------------------------------------------------

正如上面演示的,/usr/proc/bin下的命令使用很簡(jiǎn)單,只需要在命令行上指定PID 。然而,留心權(quán)限許可設(shè)置,與所有普通Unix文件一樣,你無(wú)權(quán)訪問(wèn)那些權(quán)限設(shè)置上禁止訪問(wèn)的指定PID的進(jìn)程數(shù)據(jù) 。

花點(diǎn)事件看看proc(1)手冊(cè)頁(yè),熟悉其中介紹的命令,你將學(xué)會(huì)列舉指定進(jìn)程相關(guān)的庫(kù)、進(jìn)程信號(hào)設(shè)置、進(jìn)程信任設(shè)置,你甚至可以暫停、重啟進(jìn)程 。

◆ 編寫(xiě)/proc工具

/proc的魅力在于它包含了你可能想知道的關(guān)于一個(gè)進(jìn)程的任何信息,你只需要簡(jiǎn)單地從中獲取 。/usr/include/sys/procfs.h文件中定義了兩個(gè)結(jié)構(gòu),prstatus和prpsinfo,從中可以獲取指定進(jìn)程的很多信息 。下面是個(gè)例子,開(kāi)發(fā)者想知道他的應(yīng)用程序究竟占用了多少內(nèi)存 。簡(jiǎn)單!ls /proc就可以知道了 。但是,他還想知道更多細(xì)節(jié),他需要知道總的映像大小、常駐部分的大小、堆區(qū)(heap)大小、棧區(qū)(stack)大小 。此外,他希望能夠定期跟蹤這些數(shù)據(jù)信息,類似vmstat(1M)那種方式 。如上所述,聽(tīng)起來(lái)象是一個(gè)令人生畏的任務(wù) 。

譯者: Solaris 2.6開(kāi)始這兩個(gè)結(jié)構(gòu)定義在/usr/include/sys/old_procfs.h文件中

然而,通過(guò)使用/proc文件系統(tǒng),我們可以使這項(xiàng)編程挑戰(zhàn)變得容易些 。我們寫(xiě)的這個(gè)工具稱做memlook,將顯示指定PID對(duì)應(yīng)的內(nèi)存統(tǒng)計(jì)信息 。此外,可以在命令行上指定一個(gè)時(shí)間間隔,以便定期重新檢測(cè)內(nèi)存利用信息 。圖C演示了一次簡(jiǎn)單的輸出:

--------------------------------------------------------------------------

$ memlook 245
PID IMAGE RSS HEAP STACK
245 1499136 1044480 24581 8192
$

圖C: memlook的輸出舉例

--------------------------------------------------------------------------

下面是memlook.c的源代碼

--------------------------------------------------------------------------
/*
* @(#)memlook.c 1.0 10 Nov 1997
* Robert Owen Thomas robt@cymru.com
* memlook.c -- A process memory utilization reporting tool.
*
* gcc -Wall -O3 -o memlook memlook.c
*/
#pragma ident "@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com "

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

int counter = 10;

int showUsage ( const char * );
void getInfo ( int, int );

int main ( int argc, char * argv[] )
{
int fd, pid, timeloop = 0;
char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */

switch ( argc )
{
case 2:
break;
case 3:
timeloop = atoi( argv[2] );
break;
default:
showUsage( argv[0] );
break;
} /* end of switch */
pid = atoi( argv[1] );
sprintf( pidpath, "/proc/%-d", pid ); /* -表示向左靠 */
if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )
{
perror( pidpath );
exit( 1 );
}
if ( 0 < timeloop )
{
for ( ; ; )
{
getInfo( fd, pid );
sleep( timeloop );
}
}
getInfo( fd, pid );
close( fd );
exit( 0 );
} /* end of main */

int showUsage ( const char * progname )
{
fprintf( stderr, "%s: usage: %s < PID > [time delay]n", progname, progname );
exit( 3 );
} /* end of showUsage */

推薦閱讀