日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言 %-20s,一次 Rust 和C语言的混搭

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 %-20s,一次 Rust 和C语言的混搭 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

存在內(nèi)存泄露

extern crate libc;

use libc::size_t;

use libc::{FILE,c_char};

use std::string;

#[repr(C)]

pub struct mntent {

mnt_fsname :*mut c_char, /* 掛載的文件系統(tǒng)的名字 */

mnt_dir :*mut c_char, /* 掛載點(diǎn) */

mnt_type :*mut c_char, /* 文件系統(tǒng)類型:ufs、nfs 等 */

mnt_opts :*mut c_char, /* 選項(xiàng),以逗號(hào)為分隔符 */

mnt_freq : size_t, /* Dump 的頻率(以天為單位) */

mnt_passno :size_t, /* fsck檢查的次序 */

}

#[link(name = "diskstat", kind="static")]

extern "C" {

fn getdisk() -> *const c_char;

pub fn setmntent(filename : *const c_char,

ttype : *const c_char ) -> FILE;

pub fn getmntent(filep :FILE) -> mntent;

pub fn endmntent(filep: FILE) -> size_t;

}

fn main(){

let mut mnt = unsafe { ( setmntent ("/etc/mtab".to_c_str().as_ptr(), "r".to_c_str().as_ptr())) };

let mut disk_info = unsafe { string::raw::from_buf (getdisk() as *const u8 ) };

println!("{}", disk_info);

}

// gcc -c diskstat.c -o diskstat.o -fPIC

// ar -r libdiskstat.a diskstat.o

#include

#include

#include

#include

static const unsigned long long G = 1024*1024*1024ULL;

static const unsigned long long M = 1024*1024;

static const unsigned long long K = 1024;

static char str[20];

char* kscale(unsigned long b, unsigned long bs)

{

unsigned long long size = b * (unsigned long long)bs;

if (size > G)

{

sprintf(str, "%0.2f GB", size/(G*1.0));

return str;

}

else if (size > M)

{

sprintf(str, "%0.2f MB", size/(1.0*M));

return str;

}

else if (size > K)

{

sprintf(str, "%0.2f K", size/(1.0*K));

return str;

}

else

{

sprintf(str, "%0.2f B", size*1.0);

return str;

}

}

char* getdisk()

{

FILE* mount_table;

struct mntent *mount_entry;

struct statfs s;

unsigned long blocks_used;

unsigned blocks_percent_used;

const char *disp_units_hdr = NULL;

mount_table = NULL;

mount_table = setmntent("/etc/mtab", "r");

if (!mount_table)

{

fprintf(stderr, "set mount entry error\n");

return -1;

}

disp_units_hdr = " Size";

//printf("Filesystem %-15sUsed Available %s Mounted on\n",

// disp_units_hdr, "Use%");

char *disk_info = (char *)malloc(10000*sizeof(char));

strcpy(disk_info, "["); //a

// *disk_info = "[" ;

char *z = (char *)malloc(1000*sizeof(char));

while (1) {

const char *device;

const char *mount_point;

const char *fs_type;

if (mount_table) {

mount_entry = getmntent(mount_table);

if ( !mount_entry ) {

endmntent(mount_table);

break;

}

}

else

continue;

device = mount_entry->mnt_fsname;

mount_point = mount_entry->mnt_dir;

fs_type = mount_entry->mnt_type;

// fprintf(stderr, "error mount info: device=%s mountpoint=%s\n", device, mount_point);

if (statfs(mount_point, &s) != 0)

{

fprintf(stderr, "statfs failed!\n");

continue;

}

if ((s.f_blocks > 0) || !mount_table )

{

blocks_used = s.f_blocks - s.f_bfree;

blocks_percent_used = 0;

if (blocks_used + s.f_bavail)

{

blocks_percent_used = (blocks_used * 100ULL

+ (blocks_used + s.f_bavail)/2

) / (blocks_used + s.f_bavail);

}

if (strcmp(device, "rootfs") == 0)

continue;

// if (printf("hello dksks \n%-20s" + 1, device) > 20)

// printf("\n%-20s", "");

char s1[20];

char s2[20];

char s3[20];

strcpy(s1, kscale(s.f_blocks, s.f_bsize));

strcpy(s2, kscale(s.f_blocks - s.f_bfree, s.f_bsize));

strcpy(s3, kscale(s.f_bavail, s.f_bsize));

sprintf (z, "{\"device\":\"%s\",\"fs_type\":\"%s\",\"mount_point\":\"%s\",\"size\":\"%s\",\"used\":%s,\"available\":\"%s\",\"use_percent\":\"%3u%%\"},",

device,

fs_type,

mount_point,

s1,

s2,

s3,

blocks_percent_used

);

strncat(disk_info,z , 1000);

}

}

strncat(disk_info, "]", 1);

return disk_info;

}

總結(jié)

以上是生活随笔為你收集整理的c语言 %-20s,一次 Rust 和C语言的混搭的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。