【发布时间】:2017-11-08 17:58:30
【问题描述】:
在 solaris 11.0 内核模块驱动中,我需要获取父进程 id 和启动时间,然后继续这样做——这样爬上进程树。
在 Linux 内核中,我的 struct_task 包含进程 ID、开始时间。
什么是 struct_task 的等价物,以及如何在流程上下文中获取它?
谢谢
我看到了我需要的东西,但对于 用户空间。但是“open”不能在内核空间中使用..
char psfile[64];
pid_t pid;
int fd;
psinfo_t psinfo;
pid = getpid();
sprintf(psfile, "/proc/%d/psinfo", pid);
if ((fd = open(psfile, O_RDONLY)) >= 0) {
if (read(fd, &psinfo, sizeof(psinfo_t)) != -1) {
printf("Pid: %ld\n", psinfo.pr_pid);
printf("Up Start: (%ld, %ld)\n", psinfo.pr_start.tv_sec,
psinfo.pr_start.tv_nsec);
printf("Command: %s\n", psinfo.pr_fname);
return 0;
}
} else {
perror("Open psfino");
}
/proc/procid/psinfo 的整个概念是允许用户空间进程读取内核数据。由于我在内核空间,如果我在内核空间,我需要从 /proc/procid/psinfo 获取数据,这是我避免的磁盘 IO...
【问题讨论】:
-
你看过getppid()吗?
-
我无法使用 fd = open(psfile, O_RDONLY)) >= 0) .. 我收到打开无效的消息,这是正确的方法吗?打开 /proc/"getppid()"/psinfo 并获取数据?也来自内核空间?
-
为了便于阅读和理解:1) 一致地缩进代码。在每个左大括号“{”之后缩进,在每个右大括号“}”之前取消缩进。建议每个缩进级别为 4 个空格。 2) 通过一个空行分隔代码块(for、if、else、while、do...while、switch、case、default)
-
@user3629249 我放的代码是用于用户空间的。这就是为什么 printf,我更新了问题。我需要它用于内核空间,为什么我要从内核去文件系统获取已经存在的数据应该存在于内核中。
-
为什么,aio 将如何帮助我,我在内核模块中,我想获取有关进程的信息,而无需转到文件系统 /proc/
标签: c solaris kernel-module