设计一个模块,该模块的功能是列出系统中所有内核进程的程序名、PID号和进程状态。生成可执行的代码
时间: 2024-03-13 07:48:00 浏览: 114
好的,这是一个比较典型的Linux系统编程问题。我们可以通过读取/proc目录下的特定文件来获取系统中所有内核进程的信息,然后对其进行处理和输出。以下是一个简单的实现方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#define PROC_DIR "/proc"
typedef struct proc_info {
char name[256];
int pid;
char state;
} proc_info_t;
int main(int argc, char *argv[]) {
DIR *dir = opendir(PROC_DIR);
if (!dir) {
perror("opendir");
return -1;
}
proc_info_t *procs = NULL;
int num_procs = 0;
struct dirent *ent;
while ((ent = readdir(dir)) != NULL) {
int pid = atoi(ent->d_name);
if (pid > 0) {
// 这是一个进程目录
char path[256];
snprintf(path, sizeof(path), "%s/%d/stat", PROC_DIR, pid);
FILE *file = fopen(path, "r");
if (!file) {
perror("fopen");
continue;
}
// 读取进程信息
proc_info_t info;
if (fscanf(file, "%d %s %c", &info.pid, info.name, &info.state) == 3) {
// 将进程信息存入数组
procs = realloc(procs, (num_procs + 1) * sizeof(proc_info_t));
memcpy(&procs[num_procs], &info, sizeof(proc_info_t));
num_procs++;
}
fclose(file);
}
}
closedir(dir);
// 输出进程信息
printf("%-10s %-10s %-10s\n", "PID", "NAME", "STATE");
printf("-----------------------------------\n");
for (int i = 0; i < num_procs; i++) {
printf("%-10d %-10s %-10c\n", procs[i].pid, procs[i].name, procs[i].state);
}
// 释放资源
free(procs);
return 0;
}
```
这个程序使用了opendir()、readdir()、fopen()、fscanf()、realloc()和free()等函数,具体的实现过程如下:
1. 使用opendir()函数打开/proc目录,获取其DIR类型的指针dir。
2. 使用readdir()函数遍历/proc目录下的所有子目录和文件,找到所有的进程目录。对于每个进程目录,我们可以通过读取其stat文件来获取进程的PID、名称和状态信息。
3. 将所有进程的信息存入一个proc_info_t类型的动态数组procs中。为了方便存储和操作,我们定义了一个proc_info_t结构体,它包含了进程的PID、名称和状态信息。
4. 遍历完/proc目录后,关闭DIR类型指针dir,并输出所有进程的信息。这里使用了printf()函数进行格式化输出。
5. 释放动态数组procs占用的内存,释放资源。
综上所述,这就是一个简单的列出系统中所有内核进程的程序名、PID号和进程状态的模块的实现方案。你可以把上述代码保存为一个名为proc_list.c的文件,并使用以下命令编译生成可执行的代码:
```
gcc -o proc_list proc_list.c
```
然后运行生成的可执行文件即可。
阅读全文