如何通过遍历进程列表,获取每个进程的 PID、PPID 等信息,再根据这些信息构建进程树,最终实现树状结构显示进程之间的父子关系。
时间: 2023-04-03 20:04:55 浏览: 98
可以使用系统调用函数获取进程列表,并通过遍历进程列表获取每个进程的 PID、PPID 等信息。然后根据这些信息构建进程树,最终实现树状结构显示进程之间的父子关系。具体实现可以参考操作系统相关的书籍或者网上的教程。
相关问题
请用C++实现遍历当前系统中的所有进程,并能用树状结构显示进程之间的父子关系。
好的,我可以回答这个问题。以下是用 C 实现遍历当前系统中的所有进程,并用树状结构显示进程之间的父子关系的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <ctype.h>
#define MAX_PATH 1024
#define MAX_NAME 256
typedef struct proc_node {
int pid;
int ppid;
char name[MAX_NAME];
struct proc_node *child;
struct proc_node *sibling;
} proc_node;
proc_node *root = NULL;
void add_node(proc_node *parent, proc_node *child) {
if (parent->child == NULL) {
parent->child = child;
} else {
proc_node *sibling = parent->child;
while (sibling->sibling != NULL) {
sibling = sibling->sibling;
}
sibling->sibling = child;
}
}
void free_tree(proc_node *node) {
if (node == NULL) {
return;
}
free_tree(node->child);
free_tree(node->sibling);
free(node);
}
void print_tree(proc_node *node, int depth) {
if (node == NULL) {
return;
}
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("%d %s\n", node->pid, node->name);
print_tree(node->child, depth + 1);
print_tree(node->sibling, depth);
}
int is_number(const char *str) {
for (int i = 0; str[i] != '\0'; i++) {
if (!isdigit(str[i])) {
return 0;
}
}
return 1;
}
void read_proc_stat(const char *path, int *pid, int *ppid, char *name) {
FILE *fp = fopen(path, "r");
if (fp == NULL) {
return;
}
fscanf(fp, "%d %s %*c %d", pid, name, ppid);
fclose(fp);
}
void traverse_proc(const char *path, proc_node *parent) {
DIR *dir = opendir(path);
if (dir == NULL) {
return;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (is_number(entry->d_name)) {
char stat_path[MAX_PATH];
snprintf(stat_path, sizeof(stat_path), "%s/%s/stat", path, entry->d_name);
int pid, ppid;
char name[MAX_NAME];
read_proc_stat(stat_path, &pid, &ppid, name);
proc_node *node = (proc_node *)malloc(sizeof(proc_node));
node->pid = pid;
node->ppid = ppid;
strncpy(node->name, name + 1, MAX_NAME - 1);
node->child = NULL;
node->sibling = NULL;
add_node(parent, node);
char subdir[MAX_PATH];
snprintf(subdir, sizeof(subdir), "%s/%s", path, entry->d_name);
traverse_proc(subdir, node);
}
}
closedir(dir);
}
int main() {
root = (proc_node *)malloc(sizeof(proc_node));
root->pid = 0;
root->ppid = 0;
strncpy(root->name, "root", MAX_NAME - 1);
root->child = NULL;
root->sibling = NULL;
traverse_proc("/proc", root);
print_tree(root, 0);
free_tree(root);
return 0;
}
本关任务:使用 psutils 库完成进程相关信息的获取
psutil是一个跨平台的Python库,用于获取有关系统进程和系统资源利用率(CPU,内存,磁盘,网络等)的信息。下面是使用psutil库完成进程相关信息获取的示例:
import psutil
# 获取所有正在运行的进程
processes = psutil.process_iter()
for proc in processes:
print("进程ID: ", proc.pid)
print("进程名称: ", proc.name())
print("创建时间: ", proc.create_time())
print("进程状态: ", proc.status())
print("进程内存使用情况: ", proc.memory_info().rss)
# 获取特定进程的详细信息
pid = 1234 # 进程ID,根据具体情况修改
process = psutil.Process(pid)
print("进程名称: ", process.name())
print("进程状态: ", process.status())
print("父进程ID: ", process.ppid())
print("进程工作目录: ", process.cwd())
print("进程启动命令: ", process.cmdline())
print("进程内存使用情况: ", process.memory_info().rss)
# 获取系统CPU利用率
print("系统CPU利用率: ", psutil.cpu_percent())
# 获取系统内存利用率
print("系统内存使用情况: ", psutil.virtual_memory())
# 获取磁盘使用情况
print("磁盘使用情况: ", psutil.disk_usage('/'))
# 获取网络连接信息
print("网络连接信息: ", psutil.net_connections())
通过使用psutil库,我们可以轻松地获取有关系统进程和系统资源利用率的各种信息。我们可以遍历所有正在运行的进程,获取每个进程的名称、创建时间、状态和内存使用情况等。我们还可以根据进程ID获取特定进程的详细信息,例如父进程ID、工作目录、启动命令和内存使用情况等。此外,psutil还提供了获取系统CPU利用率、系统内存利用率、磁盘使用情况和网络连接信息的方法。通过使用psutil库,我们可以方便地监控和管理系统的进程和资源使用情况。