獲得u盤的插入或者拔取得資訊的傳統方法是在核心級執行hotplug程式,相關引數通過環境變數傳遞過來,再由hotplug通知其他關注hotplug的應用程式,但是效率比較低.
網上查詢知道:
使用者空間的程式與裝置通訊的方法,主要有以下幾種方式,
1. 通過ioperm獲取操作io埠的許可權,然後用inb/inw/ inl/ outb/outw/outl等函式,避開裝置驅動程式,直接去操作io埠。(沒有用過)
2. 用ioctl函式去操作/dev目錄下對應的裝置,這是裝置驅動程式提供的介面。像鍵盤、滑鼠和觸控螢幕等輸入裝置一般都是這樣做的。
3. 用write/read/mmap去操作/dev目錄下對應的裝置,這也是裝置驅動程式提供的介面。像framebuffer等都是這樣做的。
上面的方法在大多數情況下,都可以正常工作,但是對於熱插撥(hotplug)的裝置,比如像u盤,就有點困難了,因為不知道:什麼時候裝置插上了,什麼時候裝置拔掉了。這就是所謂的hotplug問題了。
新的方法是採用netlink實現的,這是一種特殊型別的socket,專門用於核心空間與使用者空間的非同步通訊。
先說明幾個總要的結構體:
sockaddr_nl結構:
struct sockaddr_nl nl;
int setsockopt(
socket s,
int level,
int optname,
const char* optval,
int optlen
);s(套接字): 指向乙個開啟的套介面描述字
level:(級別): 指定選項**的型別。
sol_socket: 基本套介面
ipproto_ip: ipv4套介面
ipproto_ipv6: ipv6套介面
ipproto_tcp: tcp套介面
optname(選項名): 選項名稱
optval(選項值): 是乙個指向變數的指標 型別:整形,套介面結構, 其他結構型別:linger{}, timeval
optlen(選項長度) :optval 的大小
貼出**:
#include #include #include #include #include #include #include #include int init_socket()
// 該函式主要作用時檢測u盤的 總空間,剩餘空間,剩餘空間百分比
double getdiskfreespacepercent(const char *pdisk,double* freespace,double* totalspace)
return freespacepercent = (*freespace)/(*totalspace)*100;
}#define buffer_size 2048
int main()
; recv(sd,&buf,sizeof(buf),0);
//printf("%s\n",buf);
if(!memcmp(buf,"add@",4) /*&& !memcmp(&buf[strlen(buf) - 4],"/sdb",4)*/)
}printf("是否開啟u盤y/n\n");
char c;
scanf("%c",&c);
if(c=='y' || c=='y')
else
}else if(c=='n' || c=='n')
percent = getdiskfreespacepercent(path,&f,&t);
printf("u盤剩餘空間: %.2f\n",f);
printf("u盤總空間: %.2f\n",t);
printf("u盤剩餘空間百分比: %0.2f%%\n",percent);
linux下U盤狀態檢測
linux的檔案系統是非同步的,也就是說寫乙個檔案不是立刻儲存到介質 硬碟,u盤等 中,而是存到緩衝區內,等積累到一定程度再一起儲存到介質中。如果沒有umount就非法拔出u盤,程式是不知道的,fopen,fwrite等函式都依然返回正確,知道作業系統要把寫介質的時候,才會提示i o錯誤。可是很多資...
linux下u盤使用
方案一 linux不像windows一樣,接上新硬體後可以自動識別,在linux下無法自動識別新硬體的,需要手動去識別。usb移動儲存裝置通常被識別為sda1,具體可以通過fdisk l命令查詢。在使用u盤前,我們先要為外掛程式點新建乙個子目錄,一般外掛程式點的子目錄都是建立在 mnt裡面的,我們也...
Linux下使用U盤
linux不像windows一樣,接上新硬體後可以自動識別,在linux下無法自動識別新硬體的,需要手動去識別。usb移動儲存裝置通常被識別為sda1,具體可以通過fdisk l命令查詢。在使用u盤前,我們先要為外掛程式點新建乙個子目錄,一般外掛程式點的子目錄都是建立在 mnt裡面的,我們也建在那裡...