我正在寻找将 PID 值从用户空间复制到内核空间,这是我的代码快照。
内核模块:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/siginfo.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/signal.h>
MODULE_LICENSE ("GPL");
struct siginfo sinfo;
pid_t pid;
struct task_struct *task;
int init_module()
{
memset(&sinfo, 0, sizeof(struct siginfo));
sinfo.si_signo = SIGIO;
sinfo.si_code = SI_USER;
pid = 5218; // Everytime a new PID
// task = find_task_by_vpid(pid); I am also working on new and old version of UBUNTU so thats why this is here
task = pid_task(find_vpid(pid), PIDTYPE_PID);
printk("%d .\n", task);
if(task == NULL) {
printk("Cannot find PID from user program\r\n");
return 0;
}
send_sig_info(SIGIO, &sinfo, task);
return 0;
}
void cleanup_module ()
{
printk(KERN_ALERT"\nGoodBye World\n\n");
}
用户空间代码:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
void signal_handler(int signum)
{
if (signum == SIGIO) printf("SIGIO\r\n"); return;
}
int main()
{
int i = 1;
signal(SIGIO, signal_handler);
printf("My PID is %d.\n", getpid());
while (i);
return 0;
}
现在,在这里我总是运行用户空间程序来获取 PID,然后我总是必须在内核模块中编辑 pid 变量。
我找到了一种将信息从用户空间访问到内核空间的方法,反之亦然(即,使用copy_from/to_user()
)
但是我无法理解它们中的任何一个从用户空间获取 PID,我必须在/dev
目录中创建文件,并且应该应用所有必需的函数来获取 PID?
还有其他方法吗?如果没有,那么任何人都可以帮我这样做吗?我是 c 编程新手,直接玩内核模块,所以对我来说很难。