linux下u盤檢測程式

2021-06-26 09:59:45 字數 2335 閱讀 8112

獲得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裡面的,我們也建在那裡...