Linux 下用管道执行 ps aux | grep 进程ID 来获取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

转自:http://blog.sina.com.cn/s/blog_4c451e0e0101cmrq.html

原文地址:https://www.cnblogs.com/liushui-sky/p/9241143.html

时间: 2024-07-30 11:56:40

Linux 下用管道执行 ps aux | grep 进程ID 来获取CPU与内存占用率的相关文章

linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定

背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[[email protected] vhost]# ps auxUSER       PID  %CPU    %MEM    VSZ   RSS TTY      STAT    START   TIME COMMAND解释:linux 下的ps命令USER 进程运行用户PID    进程编号%CPU 进程的cpu占用率%MEM 进程的内存占用率VSZ

编程获取linux的CPU使用率内存占用率

Linux下提供top.ps命令查看当前cpu.mem使用情况,简要介绍如下: 一.使用ps查看进程的资源占用 ps -aux 查看进程信息时,第三列就是CPU占用. [[email protected] utx86]# ps -aux | grep my_process Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ root   14415  3.4  0.9   37436  203

linux系统cpu和内存占用率

1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行 c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( d

linux下查看进程的命令,ps | grep 和 ps aux | grep 区别简要

ps | grep 和 ps aux | grep两个命令差别在于ps的参数aux,ps是显示当前状态处于running的进程,grep表示在这些里搜索,而ps aux是显示所有进程和其状态.下面是ps命令解释:名称:ps使用权限:所有使用者使用方式:ps [options] [--help]说明:显示瞬间行程 (process) 的动态参数:ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义-A 列出所有的进程-w 显示加宽可以显示较多的资讯-au 显示较详细的资讯-aux 显示所有包

linux命令ps aux | grep xxx详解

要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的. ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的. 如果想对进程时间监控,应该用 top 工具. 如果直接用ps命令,会显示所有进程的状态,通常结合grep

linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法

PS查看进程 inux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) ps工具标识进程的5种状态码: D 不可中断 uninterruptible s

linux下无线鼠标驱动执行流程

操作系统: debian 7.4(linux 3.2.54) 硬件: 一个无线鼠标.一个有线鼠标 从淘宝上花了15块钱买了个无线鼠标,很好奇它的驱动程序是如何执行的. 首先执行下面命令来捕获uevent事件: sudo udevadm monitor 然后插入和移除再插入无线鼠标的nano接收器(为了完整的查看信息才操作这么多次),可以在控制台下查看到下面的信息: $ sudo udevadm monitor monitor will print the received events for:

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

Linux下C语言执行过程(预处理,编译,汇编,链接,执行)

1.C语言的执行过程包括5个步骤:分别是:预处理,编译,汇编,链接,执行 第一步:编写C源代码,截图如下: 2.预处理,命令为:gcc -E variable.c -o variable.i(这步的作用是文件的展开和宏替换),生成的文件类型是.i类型的. 3.编译:命令为:gcc -S variable.i -o variable.s,这里的.s文件就成了会变语言,截图如下: 4.汇编,命令是:gcc -c variable.s -o variable.o,截图如下: 5,链接:命令:gcc -