内核与用户层交互两种方式

除去通常的netlink机制之外,本文介绍两种内核主动发起与用户层的交互机制。类似ioctl、proc文件操作或者socket类等用户层发起的与内核交互操作不在此讨论。

内核调用用户层应用程序,使用函数call_usermodehelper实现,其参数为用户层应用程序的目录path,需要传递的参数argv、环境参数envp和参数wait。最后一个参数wait可指定是否需要等待应用程序执行完成,设置为UMH_NO_WAIT(0)表示不等待。

int call_usermodehelper(const char *path, char **argv, char **envp, int wait)
{
    struct subprocess_info *info;
    gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;

    info = call_usermodehelper_setup(path, argv, envp, gfp_mask,
                     NULL, NULL, NULL);

    return call_usermodehelper_exec(info, wait);
}

另外一种是内核通过send_sig函数发送指定的信号给应用程序。这个使用是有前提的,因为其第二个参数task_struct为要给其发送信号的应用程序的task结构体,如果知道应用程序运行时的进程ID号,在内核中可通过函数find_task_by_vpid获取到其对应的task结构。

struct task_struct *find_task_by_vpid(pid_t vnr)
{
    return find_task_by_pid_ns(vnr, task_active_pid_ns(current));
}
int send_sig(int sig, struct task_struct *p, int priv)
{
    return send_sig_info(sig, __si_special(priv), p);
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页