我需要确定用户进程是否曾以某种方式被抢占,我知道我们在preempt.h和sched.c中有钩子,这允许我们定义preempt_notifiers,它可以在重新调度进程时调用sched_in和sched_out函数。或者先发制人。
但我仍然无法找到如何将通知程序附加到用户空间中的特定进程或pid,然后以某种方式记录此特定进程是否已被抢占。我假设我必须编写一个模块来执行此操作,但是如何将pid附加到特定的通知程序?
答案 0 :(得分:1)
通知程序本身就是每个进程。注册时,您正在注册当前进程。请参阅preempt_notifier_register()
中的代码,它将notifer附加到current->preempt_notifiers
。
答案 1 :(得分:1)
所以我写了一个模块和角色设备并实现了一个ioctl调用,但显然当我确实调用我的linux系统时,除了鼠标移动之外什么都没有用,唯一的出路就是重启。仅当“preempt_notifier_register(& notifier);”时才会出现这种情况。呼叫到位,否则ioctl呼叫从用户进程顺利进行。
关于我可能做错的任何线索。
/ **从用户进程发生ioctl系统调用时调用* / long omp_ioctl_register_notifier(struct file * filp,unsigned int cmd,unsigned long arg) {
switch(cmd) {
case OMP_IOC_REGISTER_NOTIFIER:
//mutex_lock(&preempt_mutex);
printk(KERN_INFO "In the ioctl command");
struct preempt_notifier notifier;
preempt_notifier_init(¬ifier, &omp_preempt_ops);
preempt_notifier_register(¬ifier);
//mutex_unlock(&preempt_mutex);
break;
default:
printk(KERN_INFO "Wrong command");
return 1;
}
return 0;
}
答案 2 :(得分:0)
伪文件/proc/<pid>/status
包含一行nonvoluntary_ctxt_switches:
,它似乎是您所追求的信息。