[linux-kernel] 进程退出时能做些什么?

作者:董昊 (要转载的同学帮忙把名字和博客链接http://oldblog.donghao.org/uii/带上,多谢了!)


linux 上,进程退出会自动flush文件,自动close fd,自动释放占用的内存空间,等等,这些我们都知道了,不用管它。设想我们有个应用,进程退出前要做一个删除文件的操作,但是万一这个进程被别人 kill了或者自己coredump了,那这个操作就完不成了,怎么办?


不要再拘泥于OS之上的应用程序了!我们做一个虚拟设备解决这个问题:做一个miscdevice,然后实现它file_operations里的flush方法,在里面加上删文件的操作。在启动应用进程时打开这个miscdevice,然后,不管什么情况,只要该进程挂了,就会调用flush(这是linux kernel做的,dirver不用实现),而flush就会执行删除文件的操作(这是要自己写到驱动里)。


下面是代码示例:


int sample_flush(struct file* file)

{

    down(&inode_mutex);


    if (file)

    {

        atomic_inc(&file->f_count);

       

        if (file->f_dentry)

        {

            dget(file->f_dentry)

           

            node = file->f_dentry->d_inode;

       

            if (node)

            {

                atomic_inc(&node->i_count);

               

                if (node->i_nlink)

                {

                    parent = file->f_dentry->d_parent;

                   

                    if (!IS_ERR(file->f_dentry))

                    {

                        if (parent->d_inode)

                            vfs_unlink(parent->d_inode, file->f_dentry);

                    }

                }

               

                iput(node);

            }

           

            dput(file->f_dentry);

        }


        atomic_dec(&file->f_count);

    }


    up(&inode_mutex);

}


struct file_operations sample_fops =

{

    .flush = sample_flush;

}


很多人会被上面的代码搞晕:这么如此多的get/put和down/up?没办法,这就是内核代码,要应付各种数据结构的引用记数,还要应付多核,真正核心的其实只有这个vfs_unlink而已。


这只是个例子,flush能做的不仅是删个文件,还可以断个连接,发个邮件,躲个猫猫......OS能做的它都能做,当然,驱动也要靠硬件运转,如果机器直接宕机,那这个操作肯定是做不了。


相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 03 15, 2010 9:52 AM.

[linux-kernel] 内核里读取mmap文件的内容 was the previous entry in this blog.

QEMU 与 Bochs is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.