linux中 pwd *****,linux命令自己写--pwd
其實這個命令不是非常常用的命令,至少對于我來說這個命令的使用頻率不是那么的高。但是學習這個編寫這個命令有助于了解文件系統的相關知識。
對于這個命令需要了解的重要知識點就是i-node.
首先從文件系統的內部結構談起,unix/linux的文件系統其實是經過了三層抽象的。
1.磁盤到分區
很簡單,那就是一個磁盤被分為了幾個區域,就像國家被分為不同的省市一樣。
每個分區可以看作是獨立的磁盤。
2.磁盤到塊序列
將每個磁盤表面劃分為同心圓,這些同心圓又被分作扇區,就像街道被劃分為住宅單元。于是就就構成了基本的儲存單元----扇區。每個扇區是可以儲存一定字節的數據,例如每個扇區的大小是512字節。
將這些扇區編號使得系統可以計數磁盤上的每個塊,,就像給街道的房屋編號一樣,給磁盤的每個塊分配一個序號。
一個將磁盤扇區編號的系統使得我們可以把磁盤視作一系列塊的系統。
3.塊序列到三個區域的劃分
文件系統是用來儲存文件內容,文件屬性(文件所有者,日期等)和目錄,這些不同的數據是如何儲存在被編號的磁盤快上的呢?
unix中將磁盤塊分為了三個部分:超級塊(super-block),i-節點表(i-node table),數據區(data)。
=======i-node========
每個文件都有屬性,包括大小,文件所有者,最近修改時間等等。這些性質被記錄在一個被稱為i-node的結構中,所有的i-node的大小相同。所有文件的i-node構成一個i-node表。
表中的每個i-node都通過位置來標識,例如標識為2的i-node位于文件系統的第三個位置。
i-node實際上代表了一個文件,i-node包含了文件的屬性和數據塊的列表。
下面直觀的看看
$ls -1ia example
(注意是-1不是字母l)
可以看到左邊是i-node,右邊是文件名。就是說文件名x名對應的i-node號是123445
當前目錄用“.”表示,i-node號是234345(隨便舉例的)。這就意味著當前目錄的相關信息比如文件大,文件所有者等信息是放在編號為234345的i-node節點中的。然后再通過i-node中所指向的數據塊來讀取文件的內容。
======編寫pwd====
以下的代碼僅僅是最大限度的說明pwd的思路,要讓程序順利的編譯通過和運行,還要稍加整理和添加一些東西
首先是相關的頭文件
#include#include#include#include
我們的思路:
編寫函數get_inode(char *file_name)得到相關文件的i-node
編寫函數inode_to_name(ino_t, char *, int)將我們得到的i-node轉化為文件的名字
編寫函數print_path(ino_t)將路徑名字打印出來。
6 ino_t get_inode(char *file_name)
7 {
8 struct stat info;
9 if( ( stat(file_name, &info) ) == -1 )
10 {
11 fprintf(stderr, "cannot stat");
x 12 perror("stat");
13 exit(1);
14 }
15 return info.st_ino;
16 }
這個函數返回指向stat的成員變量。
void inode_to_name(ino_t inode_to_find, char *file_name, int buflen)
19 {
20 DIR *dir_ptr;
21 dir_ptr = opendir(".");
22 if( dir_ptr == NULL )
23 {
24 perror( "." );
25 exit(1);
26 }
27 struct dirent *dir_enpt;
28 while( ( dir_enpt = readdir( dir_ptr ) ) != NULL )
29 {
30 if( dir_enpt->d_ino == inode_to_find )
31 {
x 32 strncpy(file_name, dir_enpt->d_name, buflen);
33 file_name[buflen-1]='\0';
34 closedir( dir_ptr );
35 }
36 }
37 }
最后一個就是將路徑名字打印出來啦
運用的遞歸,沒有使用while循環操作
38 void print_path( ino_t this_inode )
39 {
40 ino_t my_inode;
41 char its_name[BUFSIZ];
x 42 if( get_inode( ".." ) != this_inode )
43 {
x 44 chdir("..");
x 45 inode_to_name(this_inode, its_name, BUFSIZ);
46 my_inode = get_inode(".");
47 print_path( my_inode );
48 printf("/%s", its_name);
49 }
50 }簡單說說這里的業務邏輯吧。
想想在shell中輸入pwd命令。。。。。。。。。。。。
開始執行get_inode( "." ),參數是當前的工作目錄,返回值是當前目錄的i-node號,命名為this_inode.
將當前目錄的i-node(即就是this_inode)和上一級目錄(父目錄)的i-node比較(上一級的i-node同樣是用get_inode( ".." )得到,只不過參數變成了"..")如果不相同的話,轉入上一級目錄,同時通過inode_to_name()函數將當前的this_inode轉換為目錄的名字。chdir函數是改變進程的工作目錄的,到達父目錄后,同樣的方法得到父目錄的i-node,(此時的父目錄就是當前目錄了),遞歸調用print_path函數打印出路徑名稱。當到達根目錄的時候,由于根目錄的this_inode和它的父目錄的i-node是相同的,那么打印結束,整個業務流程結束。
總結
以上是生活随笔為你收集整理的linux中 pwd *****,linux命令自己写--pwd的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 触摸屏mtp文件转c语言,F28335与
- 下一篇: android 补间动画重复次数,9.1