用NETLINK实现磁盘满通知

用NETLINK实现磁盘满通知,第1张

概述转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 <xianjimli at hotmail dot com> 手机内置FLASH容量有限,在磁盘空间不足的情况下,应该提醒用户进行磁盘清理。这个处理在哪里做比较好呢?每次写入数据时由调用者检测显然是不合理的,因为处理的太多了,何况修改SQLITE等第三方程序也是不明智的,那样会给升

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

手机内置FLASH容量有限,在磁盘空间不足的情况下,应该提醒用户进行磁盘清理。这个处理在哪里做比较好呢?每次写入数据时由调用者检测显然是不合理的,因为处理的太多了,何况修改sqlITE等第三方程序也是不明智的,那样会给升级版本带来麻烦。比较好的办法是在文件系统中做处理,最近同事修改了yaffs2支持磁盘满通知功能。做法如下:

在yaffs_fs.c中:#include <net/sock.h><linux/netlink.h>#define disK_FulL_MSG_SIZE  128#define NETlink_disK_FulL   2static struct sock * yaffs_sock;在init_yaffs_fs中:    if((yaffs_sock = netlink_kernel_create(NETlink_disK_FulL,1,255); ">NulL,THIS_MODulE)) == NulL)    {        printk(KERN_INFO"netlink_kernel_create fail./n");    }在exit_yaffs_fs中:    if(yaffs_sock != NulL)    {        sock_release(yaffs_sock);        yaffs_sock = NulL;    }增加两个函数:voID yaffs_notify_space_full(const char* partition,char* type,87); ">int totalchunk,87); ">int freechunk){    size_t len = 0;    char *scratch = NulL;    struct sk_buff *skb = NulL;    totalchunk >>= 10;    freechunk  >>= 10;    len = disK_FulL_MSG_SIZE;    skb = alloc_skb(len,GFP_KERNEL);    if (skb)    {        scratch = skb_put(skb,len);        sprintf(scratch,255); ">"diskevent: type=%s total=%dKB free=KB partition=",type,totalchunk,freechunk,partition);        NETlink_CB(skb).dst_group = 1;        netlink_broadcast(yaffs_sock,skb,255); ">0,GFP_KERNEL);    }    return;}voID yaffs_notify_app_if_space_full(yaffs_Device * dev){    if (yaffs_sock)    {        char* type = NulL;        int totalchunk = (dev->endBlock - dev->startBlock + 1) * dev->nChunksPerBlock * dev->nDataBytesPerChunk;        int freechunk =  yaffs_GetNumberOfFreeChunks(dev) * dev->nDataBytesPerChunk;        if (freechunk < totalchunk / 100)        {            type = "full";        }        else if (freechunk < totalchunk * 5 / "low";        }        if(type != NulL)        {            yaffs_notify_space_full(dev->name,freechunk);        }    }    return;}

在yaffs_AllocateChunk中:
yaffs_notify_app_if_space_full(dev);

NETlink是linux提供的一种用于内核与用户空间进程通信的方式,使用简单,传输效率高,hotplug事件也是通过这种方式通知udev的。

用户空间监听磁盘满事件的实现很简单,我提供了一个示例,有兴趣的朋友可以到这里下载。

总结

以上是内存溢出为你收集整理的用NETLINK实现磁盘满通知全部内容,希望文章能够帮你解决用NETLINK实现磁盘满通知所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1178404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存