[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能做的它都能做,当然,驱动也要靠硬件运转,如果机器直接宕机,那这个操作肯定是做不了。
相关文章
- [kernel] linux在多核处理器上的负载均衡原理 - 07 20, 2010
- [kernel] 在release方法里,而不是flush方法里释放 - 06 01, 2010
- [linux] tail和poll无关 - 06 01, 2010
留言: