在设备驱动程序中使用stdlib.h

时间:2014-04-18 08:44:08

标签: c linux linux-kernel linux-device-driver kernel-module

我正在尝试编写设备驱动程序,我需要在驱动程序中使用system()函数。要使用system(),我们需要包含<stdlib.h>,其中dosnt似乎适用于驱动程序。

它没有找到这样的文件或目录。

设备驱动程序是否有stdlib.h替代方案?或者替代system()

2 个答案:

答案 0 :(得分:5)

stdlib.h是一个用户空间标题。

用户空间是用户进程(即内核以外的所有内容)运行的内存位置集。进程是程序的执行实例。内核的一个角色是管理此空间内的各个用户进程,并防止它们相互干扰。

只有通过使用系统调用,用户进程才能访问内核空间。系统调用是由类似Unix的操作系统中的请求,由内核执行的服务的活动进程,例如输入/输出(I / O)或进程创建。活动进程是当前正在CPU中进行的进程,与正在等待CPU下一轮进程的进程形成对比。 I / O是将数据传输到CPU或从CPU传输数据或从外围设备(如磁盘驱动器,键盘,鼠标和打印机)传输数据的任何程序,操作或设备。

请检查KERNEL DIRECTORY / include文件夹,了解内核空间中可以使用的标头。

除了系统命令之外别无选择。

一旦可能的解决方案是你可以从内核空间创建一个sys / proc条目来设置一个标志,你可以从用户空间检查标志并使用system()。

答案 1 :(得分:3)

您尝试#include stdlib.h并使用驱动程序中的system()这一事实表明您需要更多地了解内核模式编程。因此,在尝试任何此类操作之前,您真的应该理解为什么在内核环境中不存在该标头以及为什么您不能从那里使用libc system()函数。

然而,话虽如此,内核模式模拟,可以在有意义时使用:

#include <linux.kmod.h>

static char *envv[] = {
    "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
    "HOME=/",
    NULL
};
static char *argv[] = {
    "/sbin/your_program",
    "arg1",
    ...
    "argn",
    NULL
};

int status = call_usermodehelper(argv[0], argv, envv, UMH_NO_WAIT);

还有其他UMH_xxx标志允许您等待进程完成,因为system()会这样做。在这样做之前,理解你的驱动程序(或任何驱动程序)的上下文意味着什么。