linux下的應用模組傳參及驅動模組傳參的區別

2021-08-27 21:28:11 字數 2845 閱讀 8304

在使用者態下程式設計可以通過main(intargc,char*argv)來傳遞命令列引數,而編寫乙個核心模組則通過module_param ()來傳遞引數

一. 應用程式命令列傳參

執行結果如下:

二. 核心模組傳參

module_param(name, type, perm)是乙個巨集,表示向當前模組傳入引數。引數用 module_param 巨集定義來宣告, 它定義在 moduleparam.h中。

這個巨集定義應當放在任何函式之外, 典型地是出現在原檔案的前面.定義如:

static char *whom = "world";

static int howmany = 1;

module_param(howmany, int, s_irugo);

module_param(whom, charp, s_irugo);

module_param(name,type,perm)引數介紹:

功能:指定模組引數,用於在載入模組時或者模組載入以後傳遞引數給模組。

引數:name:模組引數的名稱

type: 模組引數的資料型別

perm: 模組引數的訪問許可權

其中引數type可以取以下任意一種情況:

bool : 布林型,inbool : 布林反值,charp: 字元指標(相當於char *,不超過1024位元組的字串),short: 短整型,ushort : 無符號短整型,int : 整型,uint : 無符號整型,long : 長整型,ulong: 無符號長整型。

引數perm表示此引數在sysfs檔案系統中所對應的檔案節點的屬性,其許可權在include/linux/stat.h中有定義。它的取值可以用巨集定義,也可以有數字法表示。

巨集定義有:

#defines_irusr 00400檔案所有者可讀

#defines_iwusr00200檔案所有者可寫

#defines_ixusr 00100檔案所有者可執行

#defines_irgrp00040與檔案所有者同組的使用者可讀

#defines_iwgrp00020

#defines_ixgrp 00010

#defines_iroth 00004與檔案所有者不同組的使用者可讀

#defines_iwoth00002

#defines_ixoth 00001

將數字最後三位轉化為二進位制:*** *** ***,高位往低位依次看,第一位為1表示檔案所有者可讀,第二位為1表示檔案所有者可寫,第三位為1表示檔案所有者可執行;接下來三位表示檔案所有者同組成員的許可權;再下來三位為不同組使用者許可權.

00400 ==> 400 ==> 100 000 000

數字法:1表示執行許可權,2表示寫入許可權,4表示讀取許可權。

一般用8進製表示即可,如0664。從左向右看,第一位的0表示八進位制的意思,第二位的6表示檔案所有者的許可權為可讀可寫,第三位的6表示檔案同組使用者的許可權為可讀可寫,第四位的4表示檔案其他使用者的許可權為唯讀。

例如:intirq;

char*pstr;

module_param(irq,int,0664);

module_param(pstr,charp,0000);

核心模組陣列簡介

module_param_array( name, type, nump, perm);

引數:name:模組引數的名稱

type: 模組引數的資料型別

nump:陣列元素個數指標

perm: 模組引數的訪問許可權

例如:staticintfish[10];

static int nr_fish;

module_param_array( fish, int, &nr_fish, 0664);

nr_fish:儲存最終傳遞陣列元素個數,不能大於10個

perm引數的作用是什麼?

最後的 module_param 欄位是乙個許可權值; 你應當使用 中定義的值. 這個值控制誰可以訪問這些模組引數在 sysfs 中的表示.如果 perm 被設為 0, 就根本沒有 sysfs 項. 否則, 它出現在 /sys/module下面, 帶有給定的許可權. 使用 s_irugo 作為引數可以被所有人讀取, 但是不能改變; s_irugo|s_iwusr 允許 root 來改變引數. 注意, 如果乙個引數被 sysfs 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.

測試示例內容如下:

對應該檔案的makefile如下:

執行過程如下圖示:

因為列印資訊列印到了linux後台,因此使用dmesg檢視列印資訊如下圖示:

執行結果,與**相符!

以上就可以理解為乙個最簡單的驅動測試示例程式。

linux 核心模組傳參

標頭檔案在 include linux moduleparam.h 核心模組可以通過module param來傳單個引數 module param name,type,perm name 模組引數的名稱 type 模組引數的資料型別 支援int long short uint ulong ushor...

Linux下程式設計 主函式傳參

主函式的原型為 int main int argc,char ar char envp argc 傳遞的引數列表中引數的個數 ar 傳遞的引數列表 envp 傳遞的環境變數 我們在linux中編寫乙個主函式,看一下執行結果 include include include include includ...

php CLI 模式下的傳參方法

在cli模式 命令列介面 command line inte ce 下,傳入引數有如下3種方法 一.getopt函式 php 4 4.3.0,php 5 getopt 從命令列引數列表中獲取選項 該函式會匹配傳入指令碼以單個連字元 或 開頭的選項,將其轉化為關聯陣列。建立檔案 test1.php 如...