很遗憾,没有系统调用可以公开进程ID列表。在Linux中获取此信息的方法是通过虚拟文件系统
/proc
。
如果您想要当前运行的进程PID列表,可以使用
opendir()
和
readdir()
来打开
/proc
并遍历其中的文件/目录列表。然后,您可以检查文件名为数字的目录。检查之后,您可以打开
/proc/<PID>/stat
以获取所需的信息(特别是,您需要第12个字段
majflt
)。
这里是一个简单的工作示例(可能需要进行更多错误检查和调整):
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <ctype.h>
int is_pid_dir(const struct dirent *entry) {
const char *p;
for (p = entry->d_name; *p; p++) {
if (!isdigit(*p))
return 0;
}
return 1;
}
int main(void) {
DIR *procdir;
FILE *fp;
struct dirent *entry;
char path[256 + 5 + 5];
int pid;
unsigned long maj_faults;
procdir = opendir("/proc");
if (!procdir) {
perror("opendir failed");
return 1;
}
while ((entry = readdir(procdir))) {
if (!is_pid_dir(entry))
continue;
snprintf(path, sizeof(path), "/proc/%s/stat", entry->d_name);
fp = fopen(path, "r");
if (!fp) {
perror(path);
continue;
}
fscanf(fp, "%d %s %*c %*d %*d %*d %*d %*d %*u %*lu %*lu %lu",
&pid, &path, &maj_faults
);
printf("%5d %-20s: %lu\n", pid, path, maj_faults);
fclose(fp);
}
closedir(procdir);
return 0;
}
示例输出:
1 (systemd) : 37
35 (systemd-journal) : 1
66 (systemd-udevd) : 2
91 (dbus-daemon) : 4
95 (systemd-logind) : 1
113 (dhclient) : 2
143 (unattended-upgr) : 10
148 (containerd) : 11
151 (agetty) : 1
...
closedir(procdir);
吗? - jpo38