簡體   English   中英

在設備驅動程序中使用stdlib.h

[英]Using stdlib.h within a device driver

我正在嘗試編寫設備驅動程序,並且需要在驅動程序中使用system()函數。 要使用system()我們需要包含<stdlib.h> ,它似乎在驅動程序中起作用。

它說沒有找到這樣的文件或目錄。

設備驅動程序是否可以替代stdlib.h 還是system()的替代品?

stdlib.h是用戶空間頭。

用戶空間是在其中運行用戶進程(即,除內核以外的所有內容)的那組內存位置。 進程是程序的執行實例。 內核的作用之一是管理該空間內的各個用戶進程,並防止它們相互干擾。

用戶進程只能通過使用系統調用來訪問內核空間。 系統調用是類活動的進程在類Unix操作系統中對內核執行的服務的請求,例如輸入/輸出(I / O)或進程創建。 活動進程是CPU中當前正在執行的進程,與等待CPU中下一輪的進程相反。 I / O是在與CPU以及與外圍設備(例如磁盤驅動器,鍵盤,鼠標和打印機)之間進行數據傳輸的任何程序,操作或設備。

請檢查KERNEL DIRECTORY / include文件夾,以了解可以在內核空間中使用哪些頭。

沒有什么可以替代系統命令。

一種可能的解決方案是,您可以從內核空間創建sys / proc條目來設置標志,而從用戶空間可以檢查標志並使用system()。

您嘗試#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()一樣等待進程完成。 在這樣做之前,最好先了解這對您的驅動程序(或任何驅動程序)的意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM