linux 0.11 内核学习 truncate.c
/*
* 该文件主要实现的是truncate函数,该函数是释放指定i
* 节点在设备上占用的所有逻辑块,包括直接块、一次间
* 接块和二次间接块
*/
/*
* linux/fs/truncate.c
*
* (C) 1991 Linus Torvalds
*/
#include <linux/sched.h>
#include <sys/stat.h>
/* 释放一次间接块,参数int dev, int block指明一次间接块的设备号 */
static void free_ind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
// 如果逻辑块号为0,则返回
if (!block)
return;
// 读取一次间接块,并释放其上表明使用的所有逻辑
// 块,然后释放该一次间接块的缓冲区
if (bh=bread(dev,block)) {
p = (unsigned short *) bh->b_data;
for (i=0;i<512;i++,p++)
if (*p)
free_block(dev,*p);
brelse(bh);
}
free_block(dev,block);
}
/* 释放二次间接块,int dev, int block指明二次间接块的逻辑号 */
static void free_dind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
if (!block)
return;
if (bh=bread(dev,block))
{
p = (unsigned short *) bh->b_data;
for (i=0;i<512;i++,p++)
if (*p)
free_ind(dev,*p);
brelse(bh);
}
free_block(dev,block);
}
/* 将节点对应的文件长度截为0,并释放占用的设备空间 */
void truncate(struct m_inode * inode)
{
int i;
// 如果不是常规文件或者是目录文件,则返回
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
return;
// 释放i 节点的7 个直接逻辑块,并将这7 个逻辑块项全置零
/*********************直接块************************/
for (i=0;i<7;i++)
if (inode->i_zone[i]) {
free_block(inode->i_dev,inode->i_zone[i]);
inode->i_zone[i]=0;
}
/*************************************************/
// 释放一次间接块
free_ind(inode->i_dev,inode->i_zone[7]);
// 释放二次间接块
free_dind(inode->i_dev,inode->i_zone[8]);
// 逻辑块项7、8 置零
inode->i_zone[7] = inode->i_zone[8] = 0;
// 文件大小置零
inode->i_size = 0;
// 置节
相关文档:
linux ext2 文件系统恢复被删除的文件
发布日期:2002-08-08
文章内容:
------------------------------------------------------------------------
--------
by ......
Linux各发行版本 优缺点 简介
来源: ChinaUnix博客 日期: 2008.01.21 13:43 (共有25条评论) 我要评论
Linux最早由Linus Benedict Torvalds在1991年开始编写。在这之前,Richard
Stallman创建了Free Software
Foundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(此类程序的许可方式均为 ......
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *thread1(void *);
void *thread2(void *);
int i=1;
main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1,(void *)NULL) ......
//
同步问题:
对共享数据的访问,需要同步,互斥。
在中断,抢占,多CPU,多线程 环境下尤其重要。
同步分为: 阻塞同步,非阻塞同步
阻塞同步有许多实现方式了:mutex, semaphore. 阻塞同步使用不当就可能造成死锁,活锁,优先级反转。
非阻塞同步:(现在流行三种)
wait free 很难实现,思想是本线程有限步就 ......
Linux 消息重定向办法
command > filename
把标准输出重定向到一个指定文件中
command 1 > fielname
把标准输出重定向到一个指定文件中(同上)
command 2 > filename
把标准错误重定向到一个文件中
command >! filename
把标准输出重定向到一个
指定
文件中,若文件存在,则覆盖
command >&am ......