linux使用管道命令执行ps获取cpu与内存占用率
#include <stdio.h>
#include <unistd.h>
int main()
{
char castdoutline[1024]; // ps 命令的标准输出中的一行信息
char* pctmp = null; // 指向以空格拆分后的字符串
char caselfpid[10]; // 自身进程的pid字符串
char capscmd[24]; // "ps aux | grep pid"命令字符串
memset( caselfpid, 0, sizeof( caselfpid ) );
sprintf( caselfpid,
"%d",
getpid() );
memset( capscmd, 0, sizeof( capscmd ) );
sprintf( capscmd,
"ps aux | grep %d",
getpid() );
do // 非循环,只是为了方便控制分支层次,便于控制分支流向
{
// 通过创建一个管道,调用 fork 产生一个子进程,
// 执行一个 shell 以运行命令来开启一个进程。
// 这个进程必须由 pclose() 函数关闭。
file* fp = popen( capscmd, // 一个指向以 null 结束的 shell 命令字符串的指针,
// 这行命令将被传到 bin/sh 并使用 -c 标志,
// 那么 shell 将执行这个命令从这个字符串中读取。
"r" ); // 文件指针连接到 shell 命令的标准输出
if ( null == fp )
{
printf( "call popen is failed\n" );
break;
}
memset( castdoutline, 0, sizeof( castdoutline ) );
while ( null != fgets( castdoutline,
sizeof( castdoutline ),
fp ) )
{
// 再以空格分隔符拆分字符串
pctmp = strtok( castdoutline, " " );
// 用户名跳过,直接匹配 pid ,不匹配跳过
pctmp = strtok( null, " " );
if ( 0 != strncasecmp( caselfpid,
pctmp,
strlen( caselfpid ) ) )
{
continue;
}
// 读出进程自身 cpu 占用率
pctmp = strtok( null, " " );
printf( "cpu = %s %%\n", pctmp );
// 读出进程自身 mem 占用率
pctmp = strtok( null, " " );
printf( "mem = %s %%\n", pctmp );
break;
}
// 关闭标准 i/o 流,等待命令执行结束,然后返回 shell 的终止状态。
// 如果 shell 不能被执行,
// 则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
pclose( fp );
}while ( 0 );
}
$ gcc main.c -o test
$ ./test
cpu = 1.0 %
mem = 0.0 %
$ ps aux
user pid %cpu %mem vsz rss tty stat start time command
nsc 24505 1.0 0.0 2004 232 pts/0 s+ 09:46 0:00 ./test
上一篇: 爱奇艺怎么使用超前点播看影视?