注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 操作系统 > Linux > 内容正文

Linux操作系统文件系统的桌面应用

发布时间:2006-10-27 12:58:41 来源:天极博客 网友评论 0 条

  本文中要介绍一个所谓的"Linux 文件系统的守护神",这是指一个能实时地观察 Linux 文件系统的变化情况的程序模块。能够实时的观察文件系统的变化情况,并做出及时的适当的反应,这对于应用 Linux 做桌面计算机系统来说,是十分的有趣,也是十分的重要的。本文还要介绍 Linux 文件系统的异步 I/O 的扩展。同样,这对于 Linux 系统的桌面应用也是关键的。

  1、Linux 文件系统的守护神

  传统的 Linux 文件系统呈现给用户程序的界面,确实是十分的干净利落。用户程序可以打开一个文件,向文件中线性的写入数据,从文件的某一位置开始,线性的读出数据,关闭一个文件,删除一个文件,创建一个文件,等等。请看,只有这么若干个简洁的操作原语,可是却能提供这么多丰富的应用。但是,我们注意到,用于访问 Linux 的文件系统的这些操作原语,并没有提供非常复杂的加锁解锁的功能。这是一件很奇妙的事情,如果来自不同的用户程序的请求发生了冲突怎么办呢?

  我们不妨走的再靠近一点,仔细的看看删除一个文件是怎样进行的。如果已经有一个用户程序在访问一个文件,而另外一个用户程序正好要删除这一个文件,这时会发生些什么呢?我们知道,Linux 的文件系统是基于所谓的 inode 的,每个文件都相伴有一个 inode。在 inode 中记录了关于这个文件的一些系统信息,比如文件的所有者,文件相关的一些权限记录,关于文件的若干个时间戳,等等。在内存中的 inode 还维持着一个关于自己的使用计数。每当一个 inode 所代表的文件被打开一次,这个 inode 就把关于自己的使用计数加一。每当这个 inode 所代表的文件一被关闭,这个 inode 就把关于自己的使用计数减一。当用户程序删除一个文件的时候,相关的系统调用很快就返回到这个用户程序,告诉它,相应的文件已经被删除了。但是相应的 inode 还是保留在系统中,inode 首先要检查自己的使用计数,如果使用计数为零,那么 Linux Kernel 才可以真正的去删除这个文件。如果使用计数大于零,也就是说,还有其它的用户程序在访问这一个文件,那么 Linux Kernel 需要等待这些其他的用户程序一个个都完成对这一个文件的访问才行。也就是说,要等到这个 inode 的使用计数掉到零,才能真正的去删除这一个文件。

  我们可以设想一下,如果有一个 MP3 播放程序在播放一首 MP3 音乐,我们觉得它不好听,就到硬盘上找到这个文件,把它 rm 掉了。这时候,MP3 播放程序并不受到影响,还是可以继续播放这首 MP3 音乐,虽然这时候在文件系统上用 ls 已经找不到这个 MP3 音乐文件了。实际上,一直要到 MP3 播放程序停止播放这首 MP3 音乐,然后 Linux 文件系统才真正的从硬盘上删除这个 MP3 文件。这个经验和我们在 Windows 平台上遇到的截然不同。

  在 Windows 平台上,当我们试图在文件夹窗口中用鼠标点击右键菜单删除 Winamp 正在播放的一首 MP3 音乐的时候,Windows 系统会用一个弹出对话框告诉我们,这个文件正在被使用,没办法删除。Windows 系统的关于删除文件的这样一个解释,如果使用不当的话,会带来一个滑稽可笑的问题。我们可以设想一下,用户的一个 P2P 的文件共享程序提供了一个 MP3 文件以供别人下载,恰巧这个 MP3 音乐文件十分的热门,不断的有人来下载,这个用户最终决定要节省一下带宽,想要把这个 MP3 音乐文件删除掉,但是 Windows 系统却不允许用户这样做,因为这个 P2P 的文件共享程序总是在使用这个 MP3 文件。用户要想删除这个文件,不得不先把 P2P 的文件共享程序给停下来!呵呵。

  但是 Linux 的文件系统的操作原语也有它自己的问题。我们知道,在一个 Linux Shell 的命令行上,先 rm,然后再 ls,非常的干净,被 rm 的文件没有了,被删除了。但是我们可以设想有一个图形界面的文件管理程序,当用户从 Shell 的命令行上 rm 掉一个文件的时候,这个图形界面的文件管理程序并没有收到任何人发给它的任何消息,它还以为什么都没有发生,被删除掉的文件还在那儿。这实在是很 U.G.L.Y. 啊。

  那么要想解决这个问题,一个明显的但是非常不好的办法,就是让一个后台进程 Daemon 每隔一个很短的时间间隔,就检查一下文件系统上这个目录的情况,看看有没有发生什么变化。这个办法的缺点真的是显而易见的,不但系统的性能受到影响,而且它的反应也还不是实时的。

  如果我们需要用户程序能够实时地了解文件系统上某一个目录的变化情况,从实时这个角度出发,显然,我们需要有一个中断机制。我们都知道,硬件中断能够实时地把系统某一个部件的情况反映给中央处理器,同样的,要想把位于系统内核中的文件系统的情况实时地反映给用户程序,我们也需要一个由操作系统内核到达用户进程的软件中断机制。熟悉 Linux 系统编程的读者朋友们立即就会想到,这个中断机制在 Linux 系统中早已就有了,这就是信号传递 signal。

  找到了信号传递这样一个中断用户进程的机制,一切似乎都已齐备,看来可以动手实现这样一个 Linux 文件系统的守护神,来实时地监视文件系统的变化情况,并且及时地把消息通知给用户程序了。不过且慢,让我们搜索一下 Linux Kernel,看看是否有别人也在做同样的工作。哈哈,果不其然,原来这样一个实时地监视文件系统情况的机制早已在 Linux 内核中实现了。下面一段就是取自 Linux Kernel 文档的一段小小例程,说明了 Linux Kernel 中的 dnotify 功能的用法。dnotify 就是指 directory notification,监视文件系统上一个目录中的情况。

  #define _GNU_SOURCE /* needed to get the defines */   #include /* in glibc 2.2 this has the needed    values defined */   #include    #include    #include        static volatile int event_fd;      // 信号处理例程    static void handler(int sig, siginfo_t *si, void *data)   {    event_fd = si->si_fd;   }       int main(void)   {    struct sigaction act;    int fd;        // 登记信号处理例程    act.sa_sigaction = handler;    sigemptyset(&act.sa_mask);    act.sa_flags = SA_SIGINFO;    sigaction(SIGRTMIN, &act, NULL);        // 需要了解当前目录"."的情况    fd = open(".", O_RDONLY);    fcntl(fd, F_SETSIG, SIGRTMIN);    fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);    /* we will now be notified if any of the files    in "." is modified or new files are created */    while (1) {    // 收到信号后,就会执行信号处理例程。    // 而 pause() 也就结束了。    pause();    printf("Got event on fd=%d/n", event_fd);    }   }

  上面这一小段例程,对于熟悉 Linux 系统编程的读者朋友们来说,是很容易理解的。程序首先注册一个信号处理例程,然后通知 Kernel,我要观察 fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT 事件。(关于这些事件的详细定义,请读者朋友们参阅文后所列的参考资料。) Linux Kernel 收到这个请求后,把相应的 fd 的 inode 给做上记号,然后 Linux Kernel 和用户应用程序就自顾自去处理各自的别的事情去了。等到 inode 上发生了相应的事件,Linux Kernel 就把信号发给用户进程,于是开始执行信号处理例程,用户程序对文件系统上的变化也就可以及时的做出反应了。而在这整个过程中,系统以及用户程序的正常运行基本上未受到性能上的影响。这里还需要说明的是,dnotify 并没有通过增加新的系统调用来完成它的功能,而是通过 fcntl 来完成任务的。增加一个系统调用,相对来说是一个很大的手术,而且如果设计不当,处理得不好的话,伤疤会一直留在那里,这是 Linux Kernel 的开发者们所非常不愿意见到的事情。

关于 Linux操作系统文件系统的桌面应用 的新闻
    无相关信息
【评论】【收藏本文】【打印】【关闭】
上一篇文章:Linux设备驱动编程之定时器
下一篇文章:Linux内核中的同步和互斥分析报告
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
Linux操作系统文件系统的桌面应用
Linux操作系统文件系统的桌面应用
Linux设备驱动编程之定时器
Linux设备驱动编程之定时器
Windows外衣Linux心 红旗桌面版详测
Windows外衣Linux心 红旗桌面版详测
超实用 Linux下通过VNC安装Oracle
超实用 Linux下通过VNC安装Oracle
全站资源
  • 微软官方入门教程19:轻松掌握Vista系统的快
  • 微软2008大冲击,预借Vista SP1力促Vista市
  • 在收件箱中获得 Windows Vista 的最新更新
  • 微软官方Vista入门教程全集19篇(Vista学院
  • Windows Vista 的成功将势不可挡
  • 快快抛弃Vista,拥抱XP SP3!你觉得呢?
  • 浅谈Vista系统关闭虚拟内存与使用内存盘加速
  • 嘿嘿,按下键盘上面的三个键,马上让你的Vi
  • Windows Vista的盗版率只有Windows XP的一半
  • 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
  • Windows外衣Linux心 红旗桌面版详测
  • 扮酷你的桌面 Linux超靓壁纸下载(多图)
  • Linux安装流程
  • 浅谈Linux的内核
  • RedHat Linux9.0安装实例(1)
  • ARM的嵌入式Linux移植体验之基本概念
  • Linux安装要点
  • 红旗Linux桌面版5.0BETA版OS
  • 如何在大硬盘上安装Linux
  • RealPlayer流媒体播放器Linux版
最新技术文档
  • Linux步入Unix的后尘-铁甲Linux出现
  • Linux内核中的同步和互斥分析报告
  • Linux操作系统文件系统的桌面应用
  • Linux设备驱动编程之定时器
  • 嵌入式Linux操作系统启动信息完全注释
  • 在Linux操作系统中实现内部进程通信
  • Linux大腕警告称开源软件存在安全问题
  • Linux下双网卡绑定技术实现负载均衡
  • 深入浅出Linux操作系统的优化和微调
  • Linux下的中文显示和支持常见问题解答
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载