標籤:實現 overflow name lib bre include 擷取 操作 enter
Linux下使用fstatfs/statfs查詢系統相關資訊1. 功能
#include < sys/statfs.h >
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
查詢檔案系統相關的資訊。
2. 參數
path: 須要查詢資訊的檔案系統的檔案路徑名。
fd: 須要查詢資訊的檔案系統的檔案描寫敘述符。
buf:下面結構體的指標變數,用於儲存檔案系統相關的資訊
struct statfs {
long f_type; /* 檔案系統類型 */
long f_bsize; /* 經過最佳化的傳輸塊大小 */
long f_blocks; /* 檔案系統資料區塊總數 */
long f_bfree; /* 可用塊數 */
long f_bavail; /* 非超級使用者可擷取的塊數*/
long f_files; /* 檔案結點總數 */
long f_ffree; /* 可用檔案結點數 */
fsid_t f_fsid; /* 檔案系統標識 */
long f_namelen; /* 檔案名稱的最大長度 */
};
3. 傳回值
成功運行時,返回0。
失敗返回-1。errno被設為下面的某個值
EACCES: (statfs())檔案或路徑名中包括的檔案夾不可訪問
EBADF : (fstatfs())檔案描寫敘述詞無效
EFAULT: 記憶體位址無效
EINTR : 操作由訊號中斷
EIO : 讀寫出錯
ELOOP : (statfs())解釋路徑名過程中存在太多的符號串連
ENAMETOOLONG:(statfs()) 路徑名太長
ENOENT:(statfs()) 檔案不存在
ENOMEM: 核心記憶體不足
ENOSYS: 檔案系統不支援調用
ENOTDIR:(statfs())路徑名中當作檔案夾的組件並不是檔案夾
EOVERFLOW:資訊溢出
4. 執行個體
#include <sys/vfs.h>
#include <stdio.h>
int main()
{
struct statfs diskInfo;
statfs("/",&diskInfo);
unsigned long long blocksize =diskInfo.f_bsize;// 每一個block裡麵包括的位元組數
unsigned long long totalsize =blocksize * diskInfo.f_blocks;//總的位元組數
printf("TOTAL_SIZE == %luMB/n",totalsize>>20); // 1024*1024 =1MB 換算成MB單位
unsigned long long freeDisk =diskInfo.f_bfree*blocksize; //再計算下剩餘的空間大小
printf("DISK_FREE == %ldMB/n",freeDisk>>20);
return 0;
}
附:
linux df命令實現:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/statfs.h>
static int ok = EXIT_SUCCESS;
static void printsize(long long n)
{
char unit = ‘K‘;
n /= 1024;
if (n > 1024) {
n /= 1024;
unit = ‘M‘;
}
if (n > 1024) {
n /= 1024;
unit = ‘G‘;
}
printf("%4lld%c", n, unit);
}
static void df(char *s, int always) {
struct statfs st;
if (statfs(s, &st) < 0) {
fprintf(stderr,"%s: %s\n", s, strerror(errno));
ok = EXIT_FAILURE;
} else {
if(st.f_blocks == 0 && !always)
return;
printf("%-20s", s);
printf("%-20s", s);
printsize((longlong)st.f_blocks * (long long)st.f_bsize);
printf("");
printsize((longlong)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);
printf("");
printsize((longlong)st.f_bfree * (long long)st.f_bsize);
printf("%d\n", (int) st.f_bsize);
}
}
int main(int argc, char *argv[]) {
printf("Filesystem Size Used Free Blksize\n");
if (argc == 1) {
char s[2000];
FILE *f =fopen("/proc/mounts", "r");
while (fgets(s, 2000, f)) {
char *c, *e = s;
for (c = s; *c; c++) {
if(*c == ‘ ‘) {
e =c + 1;
break;
}
}
for (c = e; *c; c++) {
if (*c == ‘‘) {
*c = ‘\0‘;
break;
}
}
df(e, 0);
}
fclose(f);
} else {
printf(" NO argv\n");
int i;
for (i = 1; i< argc; i++) {
df(argv[i],1);
}
}
exit(ok);
}
Linux下使用fstatfs/statfs查詢系統相關資訊