【发布时间】:2020-02-19 15:05:11
【问题描述】:
我有一个关于在 Linux 内核中添加系统调用的练习,但我正在努力实现它。以下是说明:
这个任务的主要部分是实现一个新的系统调用,让用户确定有关父进程和最旧子进程的信息。进程信息的信息通过以下结构体表示:
struct procinfos{
long studentID;
struct proc_info proc;
struct proc_info parent_proc;
struct proc_info oldest_child_proc;
};
其中proc_info定义如下:
struct proc_info{
pid_t pid;
char name[16];
};
procinfos包含三个进程的信息:
-
proc,当前进程或带PID的进程 -
parent_proc,第一个进程的父进程 -
oldest_child_proc,第一个进程最老的子进程
进程的信息存储在结构proc_info中,包含:
-
pid,进程的pid -
name,被执行的程序名
我们系统调用的原型描述如下:
要调用get_proc_info系统调用,用户必须提供进程的PID或−1在当前进程的情况下。如果系统调用找到具有给定PID的进程,它将获取进程的信息,将其放入输出参数*info,并返回0。但是,如果系统调用找不到这样的进程,就会返回
EINVAL.
#include <linux/kernel.h>
#include <unistd.h>
struct procinfos{
long studentID;
struct proc_info proc;
struct proc_info parent_proc;
struct proc_info oldest_child_proc;
};
struct proc_info{
pid_t pid;
char name[16];
};
asmlinkage long sys_get_proc_info(pid_t pid, struct proinfos *info){
// TODO: implement the system call
}
提示:
- 要查找当前进程:查看
arch/x86/include/asm/current.h或简单地使用宏当前(当前 -> pid)。 - 要查找有关每个进程的信息,请查看
include/linux/sched.h。 - 在修整过程之后,构建内核的时间减少到大约 10 分钟,但编译时间很长。为了尽可能快地开发系统调用,您可以使用内核模块预先测试以模块表示的系统调用(Appd B)。
如何实现这个系统调用?
【问题讨论】:
-
欢迎来到 Stack Overflow!虽然这里不禁止“家庭作业”问题,但我们不会为您做作业。但是,我们可以帮助您完成您的作业,但为此您需要指定一个您无法解决且需要帮助的问题。问题示例:“如何实现系统调用?”、“如何列出进程”、“我的代码列出了进程,但这样做太慢了”。
标签: c linux-kernel