将preempt_notifier附加到linux中的用户进程

时间:2012-08-13 17:14:26

标签: linux linux-kernel preemption

我需要确定用户进程是否曾以某种方式被抢占,我知道我们在preempt.h和sched.c中有钩子,这允许我们定义preempt_notifiers,它可以在重新调度进程时调用sched_in和sched_out函数。或者先发制人。

但我仍然无法找到如何将通知程序附加到用户空间中的特定进程或pid,然后以某种方式记录此特定进程是否已被抢占。我假设我必须编写一个模块来执行此操作,但是如何将pid附加到特定的通知程序?

3 个答案:

答案 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(&notifier, &omp_preempt_ops);
    preempt_notifier_register(&notifier);
    //mutex_unlock(&preempt_mutex);
        break;

    default: 
        printk(KERN_INFO "Wrong command");
        return 1;

}
return 0;

}

答案 2 :(得分:0)

伪文件/proc/<pid>/status包含一行nonvoluntary_ctxt_switches:,它似乎是您所追求的信息。