linux文件基礎-2_linux文件細節_lseek_文件指針

一、linux管理文件

1、硬盤中的靜態文件和inode(i節點)

1)靜態文件:放在硬盤中,固定的形式。
2)硬盤的兩大區域:
(1)硬盤內容管理表項儲存內容區域
(2)操作系統先去訪問硬盤內容管理表項->扇區級別的信息->得到儲存內容區域

3)操作系統最初拿到的是文件名,最終拿到文件內容
(1)查詢硬盤內容管理表(以文件爲單位記錄各個文件的信息)
(2)每個文件一個信息列表,即爲inode
(3)這個結構體記錄了{文件名、扇區號、塊號…}
(4)u盤的格式化:快速格式化和普通格式化的區別:快速格式化只刪除U盤的內容管理表(inode),而普通格式化則完全刪除

2、內存中被打開文件和vnode(v節點)

1)每個進程都有一個數據結構來記錄進程的所有信息(進程信息表
2)表中的指針指向文件管理表(記錄進程打開的所有文件和相關信息)
3)文件管理表:索引打開文件的index就是文件描述符fd—>找到管理結構體vnode
4)vnode記錄了被打開文件的各種信息,即fd->vnode

3、文件流

1)文件中N多的個字符被挨個一次讀出/寫入時,這些字符就構成了一個字符流
2)流這個概念是動態
3)編程中提到流這個概念,一般都是IO相關的,經常叫IO流文件操作時就構成了一個IO流

二、lseek

1、文件指針

1)打開的文件後讀寫的文件都是動態文件(內存),其形式是文件流形式。
2)GUI模式下光標來標識正在操作的位置。
3)文件指針是文件管理表的一個指針,即vnode中的一個元素,表示我們當前操作的文件流的位置。linux系統用lseek函數來訪問這個文件指針
4)我們打開空文件,默認文件指針指向文件流的開始。(先write,文件指針已經在結尾、再read就是空的)

2、lseek

函數原型:

off_t lseek(int fd, off_t offset, int whence);

whence:

as follows description
SEEK_SET 偏移量設置爲offset字節
SEEK_CUR 偏移量設置爲當前位置加上offset字節
SEEK_END 偏移量設置爲文件末尾加上偏移字節大小

返回值:
lseek()返回的結果是從文件開頭的字節偏移位置。返回-1並設置errno以指示錯誤。

1)用lseek計算文件長度

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int cal_len(const char * pathname)
{
	int fd = -1, ret = -1;
	
	fd = open(pathname, O_RDONLY);
	if (-1 == fd)
	{
		perror("文件打開錯誤")return -1;
	}
	
	// 使用文件指針移動到末尾,返回值爲開頭到結尾的偏移
	ret = lseek(fd, 0, SEEK_END);
	
	return ret;
}

int main(int argc, char *argv[])
{
	int fd = -1, ret = -1;
	
	if (argc != 2)
	{
		_exit(-1);
	}
	
	ret = cal_len(argv[1]);
	
	printf("長度:%d\n", ret);
	
}

2)構建空洞文件
(1)空洞文件是文件一段是空的。(打開文件用lseek跳過一段,再寫就是空洞文件了)
(2)空洞文件方法對多線程共同操作文件是及其有用的,創建大文件,將文件分爲多段,每個線程負責一段寫入。


注:筆記整理,參考於朱有鵬老師的嵌入式核心課程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章