在驅動開發中,ioctl是很常用的應用層與核心通訊的介面,今天除錯過程中遇到乙個ioctl呼叫不執行的問題,有點意思,寫篇部落格記錄一下。
對於網路裝置,核心通過巨集siocdevprivate給各個裝置預留了一組私有ioctl命令,驅動可以自行定義響應函式來執行相應的操作。今天接到乙個需求,要在驅動裡新增乙個清空使用者統計資訊的功能,於是相應的就需要增加乙個ioctl命令**用層呼叫。看了驅動**,已定義的私有ioctl命令從(siocdevprivate+0)一直到(siocdevprivate+16),於是理所當然的,我順著新增了一條ioctl命令:
#define ieee80211_ioctl_clear_sta_stats (siocdevprivate+17)
應用層的呼叫**如下:
int sockfd = 0;
struct iwreq iwr;
if ((sockfd = socket(af_inet, sock_dgram, 0)) < 0)
memset(&iwr, 0, sizeof(iwr));
strncpy(iwr.ifr_ifrn.ifrn_name, vapname /* 網絡卡裝置名 */, sizeof(iwr.ifr_ifrn.ifrn_name));
iwr.ifr_ifrn.ifrn_name[sizeof(iwr.ifr_ifrn.ifrn_name)-1] = '\0';
iwr.u.data.pointer = (void *)buf; /* station的mac位址 */
iwr.u.data.length = sizeof(buf);
if (ioctl(sockfd, ieee80211_ioctl_clear_sta_stats, &iwr) < 0)
編譯、燒錄很順利,但接下來發現這條ioctl呼叫沒有生效,返回一直是-1。在驅動的ioctl函式裡加列印資訊,發現除了我加的命令沒有列印輸出,驅動自帶的其他私有命令都有列印。也就是說我加的呼叫,根本沒有進到驅動的ioctl函式。對比了應用層的呼叫**,發現與其他命令並無區別,思考了一會,只能試著猜測是不是我加的命令引數超出了某個範圍限制?
為了驗證我的猜測,只能去核心原始碼中尋找答案。在核心原始碼目錄中搜尋siocdevprivate,終於在/net/core/dev_ioctl.c的dev_ioctl()函式中找到了如下**:
switch (cmd)
}
猜測得到驗證,從上面的**可以看到,根據siocdevprivate巨集來定義的私有ioctl命令只能支援16個,當命令碼超出範圍時,就不會呼叫裝置的ndo_do_ioctl函式指標(驅動中ioctl函式在核心中的掛載點)。這就是為什麼驅動自帶的ioctl命令可以進入到驅動,而我加的ioctl命令沒進驅動就直接返回了。所以當遇到看上去很奇怪的問題的時候,可以嘗試從核心原始碼中尋找答案,看似不合理的現象,背後總會有乙個合理的解釋。
3招解決信用不良問題
如今,信用變得越來越值錢 信用越好,可以貸到的額度越高 貸款機構和信用卡給的額度也會相應得到提公升。那麼怎麼樣才能盡量避免自己的信用出現不良記錄呢,莫慌,小美這就給您支幾招 1理性消費 合理規劃 按時還款 在這個物欲橫流的世界 不好意思,拿錯劇本了。咳,現在世界大了,新鮮有趣的東西越來越多,你想買的...
linux如何通過ioctl呼叫驅動的
ioctl作用 應用層的ioctl函式傳入的cmd和arg引數會直接傳入驅動層的ioctl介面,在對應驅動檔案裡會對相應的命令進行操作 對於傳遞的ioctl命令有一定的規範,具體可以參考 include asm ioctl.h,documentation ioctl number.txt 這兩個檔案...
解決「sqrt」 對過載函式的呼叫不明確
也是自己平時總結出來,希望可以對小白有幫助。高手勿噴。假如原先是這樣的 if sqrt x0 tx x0 tx y0 ty y0 ty d vs2010 vc include math.h 581 可能是 long double sqrt long double 1 d vs2010 vc incl...