在Linux中如果要監(jiān)視一個(gè)進(jìn)程的運(yùn)行情況,如查看它的CPU使用效率和內(nèi)存使用情況,就需要從系統(tǒng)的/proc目錄的讀取一些系統(tǒng)信息。然后分析得到結(jié)果,特別是在嵌入式中的應(yīng)用程序這個(gè)功能就很重要。本文中的代碼是從top命令的源代碼分析中獲得,并做了部分修改,在FC6+GCC4.1調(diào)試通過(guò)。從這個(gè)工程中我也獲得一些感悟。
1. Linux系統(tǒng)很優(yōu)雅,如果在Windows中做這個(gè)功能就需要調(diào)用ActiveX控件。而在Linux中只需要讀取文本。
2.想完成什么功能,如果不知道怎么做,就想有沒(méi)有沒(méi)有其它的軟件有這個(gè)功能,如果有,查看它的源代碼就可以了,然后定制自己需要的功能。
3.多想多看多做,學(xué)習(xí)技術(shù)的不二法門(mén)。
top命令源代碼下載:http://www.groupsys.com/top/download.shtml
工程下載:
http://m.shnenglu.com/Files/dyj057/mytop.zip
下面是獲得系統(tǒng)CPU和內(nèi)存情況的代碼:
void
get_system_info(info)
????
struct
?system_info?
*
info;
{
????
char
?buffer[
4096
+
1
];
????
int
?fd,?len;
????
char
?
*
p;
????
int
?i;
????
/*
?get?load?averages?
*/
????{
????fd?
=
?open(
"
loadavg
"
,?O_RDONLY);
????len?
=
?read(fd,?buffer,?
sizeof
(buffer)
-
1
);
????close(fd);
????buffer[len]?
=
?
'
\0
'
;
????info
->
load_avg[
0
]?
=
?strtod(buffer,?
&
p);
????info
->
load_avg[
1
]?
=
?strtod(p,?
&
p);
????info
->
load_avg[
2
]?
=
?strtod(p,?
&
p);
????p?
=
?skip_token(p);????????????
/*
?skip?running/tasks?
*/
????p?
=
?skip_ws(p);
????
if
?(
*
p)
????????info
->
last_pid?
=
?atoi(p);
????
else
????????info
->
last_pid?
=
?
-
1
;
????}
????
/*
?get?the?cpu?time?info?
*/
????{
????fd?
=
?open(
"
stat
"
,?O_RDONLY);
????len?
=
?read(fd,?buffer,?
sizeof
(buffer)
-
1
);
????close(fd);
????buffer[len]?
=
?
'
\0
'
;
????p?
=
?skip_token(buffer);????????????
/*
?"cpu"?
*/
????cp_time[
0
]?
=
?strtoul(p,?
&
p,?
0
);
????
????cp_time[
1
]?
=
?strtoul(p,?
&
p,?
0
);
????cp_time[
2
]?
=
?strtoul(p,?
&
p,?
0
);
????cp_time[
3
]?
=
?strtoul(p,?
&
p,?
0
);
????
/*
?convert?cp_time?counts?to?percentages?
*/
????percentages(
4
,?cpu_states,?cp_time,?cp_old,?cp_diff);
????}
????
????
/*
?get?system?wide?memory?usage?
*/
????{
????
char
?
*
p;
????fd?
=
?open(
"
meminfo
"
,?O_RDONLY);
????len?
=
?read(fd,?buffer,?
sizeof
(buffer)
-
1
);
????close(fd);
????buffer[len]?
=
?
'
\0
'
;
????
/*
?be?prepared?for?extra?columns?to?appear?be?seeking
???????to?ends?of?lines?
*/
????
????p?
=
?buffer;
????p?
=
?skip_token(p);
????memory_stats[
0
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?total?memory?
*/
????
????p?
=
?strchr(p,?
'
\n
'
);
????p?
=
?skip_token(p);
????memory_stats[
1
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?free?memory?
*/
????
????
????p?
=
?strchr(p,?
'
\n
'
);
????p?
=
?skip_token(p);
????memory_stats[
2
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?buffer?memory?
*/
????
????p?
=
?strchr(p,?
'
\n
'
);
????p?
=
?skip_token(p);
????memory_stats[
3
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?cached?memory?
*/
????
????
for
(i?
=
?
0
;?i
<
?
8
?;i
++
)?{
????????p
++
;
????????p?
=
?strchr(p,?
'
\n
'
);
????}
????
????p?
=
?skip_token(p);
????memory_stats[
4
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?total?swap?
*/
????
????p?
=
?strchr(p,?
'
\n
'
);
????p?
=
?skip_token(p);
????memory_stats[
5
]?
=
?strtoul(p,?
&
p,?
10
);?
/*
?free?swap?
*/
????
????}
????
/*
?set?arrays?and?strings?
*/
????info
->
cpustates?
=
?cpu_states;
????info
->
memory?
=
?memory_stats;
}
posted on 2007-01-31 15:11
天下無(wú)雙 閱讀(10627)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
Linux