【linuxC语言】获取进程信息

文章目录


前言

在Linux环境下,了解和获取进程的信息对于系统监控、性能优化以及调试等任务至关重要。C语言作为Linux系统编程的主要语言之一,提供了丰富的系统调用和库函数,可以帮助我们轻松地获取进程相关的信息。本文将介绍如何使用C语言编写代码来获取进程的信息,并举例说明如何获取进程的ID、命令行参数、状态等信息,以及如何获取进程的资源使用情况。


一、getrusage函数

getrusage() 函数用于获取进程或其子进程的资源使用情况。资源使用情况包括 CPU 时间、内存、文件 I/O 等。它的原型定义在 <sys/resource.h> 头文件中。

下面是 getrusage() 函数的原型:

c 复制代码
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

参数 who 指定了要获取资源使用情况的进程类型。常用的取值有:

RUSAGE_SELF:获取调用进程的资源使用情况。

RUSAGE_CHILDREN:获取所有子进程的资源使用情况。

如果你使用 RUSAGE_CHILDREN 参数来获取子进程的资源使用情况,那么 getrusage() 函数将会返回所有子进程的总和,而不是单个进程的信息。如果你需要获取单个进程的信息,你可以使用其他方法,比如通过进程的ID来获取该进程的信息。

一种方法是使用 getrusage() 函数来获取特定进程的资源使用情况,但是它只能获取到调用它的进程的资源使用情况,而无法获取其他进程的信息。

其他特殊值还有 RUSAGE_THREAD 用于获取当前线程的资源使用情况(Linux特有)。

参数 usage 是一个指向 struct rusage 结构的指针,用于存储获取到的资源使用情况信息。

下面是 struct rusage 结构的定义:

c 复制代码
struct rusage {
    struct timeval ru_utime; /* 用户 CPU 时间 */
    struct timeval ru_stime; /* 系统 CPU 时间 */
    long   ru_maxrss;         /* 最大常驻集大小(以 kBytes 为单位) */
    long   ru_ixrss;          /* 未使用 (历史遗留) */
    long   ru_idrss;          /* 未使用 (历史遗留) */
    long   ru_isrss;          /* 未使用 (历史遗留) */
    long   ru_minflt;         /* 缺页错误次数 */
    long   ru_majflt;         /* 分页错误次数 */
    long   ru_nswap;          /* 未使用 (历史遗留) */
    long   ru_inblock;        /* 从块设备中读取的块数量 */
    long   ru_oublock;        /* 向块设备写入的块数量 */
    long   ru_msgsnd;         /* 发送的消息数量 */
    long   ru_msgrcv;         /* 接收的消息数量 */
    long   ru_nsignals;       /* 收到的信号数量 */
    long   ru_nvcsw;          /* 由于等待虚拟时钟转换而进行的上下文切换 */
    long   ru_nivcsw;         /* 由于除了等待虚拟时钟转换之外的原因进行的上下文切换 */
};

二、示例代码

下面是一个简单的示例代码,演示如何使用 getrusage() 函数获取进程的资源使用情况:

c 复制代码
#include <stdio.h>
#include <sys/resource.h>

int main() {
    struct rusage usage;

    if (getrusage(RUSAGE_SELF, &usage) == -1) {
        perror("getrusage");
        return 1;
    }

    printf("用户 CPU 时间:%ld 微秒\n", usage.ru_utime.tv_usec);
    printf("系统 CPU 时间:%ld 微秒\n", usage.ru_stime.tv_usec);
    printf("缺页错误次数:%ld\n", usage.ru_minflt);
    printf("分页错误次数:%ld\n", usage.ru_majflt);

    return 0;
}

在这个示例中,我们使用 getrusage() 函数获取当前进程的资源使用情况,并打印了用户 CPU 时间、系统 CPU 时间、缺页错误次数和分页错误次数。


总结

通过本文的介绍,我们了解了如何使用C语言编程获取进程的信息。首先,我们可以使用系统调用getpid()来获取当前进程的ID,也可以使用getppid()获取当前进程的父进程ID。其次,我们可以通过读取/proc文件系统下的相应文件,比如/proc/[PID]/cmdline来获取进程的命令行参数,通过/proc/[PID]/status来获取进程的状态等信息。最后,我们还介绍了如何使用getrusage()函数来获取进程的资源使用情况,包括CPU时间、内存等。

总的来说,通过C语言编程获取进程的信息是一项相对简单而强大的任务,可以帮助我们更好地理解和监控系统的运行情况,为系统管理和优化提供有力的支持。

相关推荐
Championship.23.2418 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
techdashen23 分钟前
Cloudflare 为何抛弃 NGINX,用 Rust 自研了一个代理
运维·nginx·rust
南城猿36 分钟前
保姆级 Ubuntu 部署 禅道
linux·运维·ubuntu
样例过了就是过了37 分钟前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
zhangrelay1 小时前
三分钟云课实践速通--模拟电子技术-模电--SimulIDE
linux·笔记·学习·ubuntu·lubuntu
珠海西格电力1 小时前
零碳园区产业园管理系统的全场景源网荷储氢协同调度功能是如何实现的
大数据·运维·人工智能·物联网·能源
木木_王1 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
麦兜和小可的舅舅1 小时前
ClickHouse 列管理机制解析:从 COW、IColumn 到 CRTP
c++·clickhouse
超龄编码人1 小时前
Qt Widgets Designer QTabWidget无法添加布局
开发语言·qt
Joseph Cooper1 小时前
Linux Power Management 子系统:从 suspend/resume 到 Runtime PM、PM QoS
linux·驱动开发·linux kernel·嵌入式linux·电源管理