linux中 pwd *****,linux命令自己写--pwd
其實(shí)這個(gè)命令不是非常常用的命令,至少對(duì)于我來(lái)說(shuō)這個(gè)命令的使用頻率不是那么的高。但是學(xué)習(xí)這個(gè)編寫這個(gè)命令有助于了解文件系統(tǒng)的相關(guān)知識(shí)。
對(duì)于這個(gè)命令需要了解的重要知識(shí)點(diǎn)就是i-node.
首先從文件系統(tǒng)的內(nèi)部結(jié)構(gòu)談起,unix/linux的文件系統(tǒng)其實(shí)是經(jīng)過(guò)了三層抽象的。
1.磁盤到分區(qū)
很簡(jiǎn)單,那就是一個(gè)磁盤被分為了幾個(gè)區(qū)域,就像國(guó)家被分為不同的省市一樣。
每個(gè)分區(qū)可以看作是獨(dú)立的磁盤。
2.磁盤到塊序列
將每個(gè)磁盤表面劃分為同心圓,這些同心圓又被分作扇區(qū),就像街道被劃分為住宅單元。于是就就構(gòu)成了基本的儲(chǔ)存單元----扇區(qū)。每個(gè)扇區(qū)是可以儲(chǔ)存一定字節(jié)的數(shù)據(jù),例如每個(gè)扇區(qū)的大小是512字節(jié)。
將這些扇區(qū)編號(hào)使得系統(tǒng)可以計(jì)數(shù)磁盤上的每個(gè)塊,,就像給街道的房屋編號(hào)一樣,給磁盤的每個(gè)塊分配一個(gè)序號(hào)。
一個(gè)將磁盤扇區(qū)編號(hào)的系統(tǒng)使得我們可以把磁盤視作一系列塊的系統(tǒng)。
3.塊序列到三個(gè)區(qū)域的劃分
文件系統(tǒng)是用來(lái)儲(chǔ)存文件內(nèi)容,文件屬性(文件所有者,日期等)和目錄,這些不同的數(shù)據(jù)是如何儲(chǔ)存在被編號(hào)的磁盤快上的呢?
unix中將磁盤塊分為了三個(gè)部分:超級(jí)塊(super-block),i-節(jié)點(diǎn)表(i-node table),數(shù)據(jù)區(qū)(data)。
=======i-node========
每個(gè)文件都有屬性,包括大小,文件所有者,最近修改時(shí)間等等。這些性質(zhì)被記錄在一個(gè)被稱為i-node的結(jié)構(gòu)中,所有的i-node的大小相同。所有文件的i-node構(gòu)成一個(gè)i-node表。
表中的每個(gè)i-node都通過(guò)位置來(lái)標(biāo)識(shí),例如標(biāo)識(shí)為2的i-node位于文件系統(tǒng)的第三個(gè)位置。
i-node實(shí)際上代表了一個(gè)文件,i-node包含了文件的屬性和數(shù)據(jù)塊的列表。
下面直觀的看看
$ls -1ia example
(注意是-1不是字母l)
可以看到左邊是i-node,右邊是文件名。就是說(shuō)文件名x名對(duì)應(yīng)的i-node號(hào)是123445
當(dāng)前目錄用“.”表示,i-node號(hào)是234345(隨便舉例的)。這就意味著當(dāng)前目錄的相關(guān)信息比如文件大,文件所有者等信息是放在編號(hào)為234345的i-node節(jié)點(diǎn)中的。然后再通過(guò)i-node中所指向的數(shù)據(jù)塊來(lái)讀取文件的內(nèi)容。
======編寫pwd====
以下的代碼僅僅是最大限度的說(shuō)明pwd的思路,要讓程序順利的編譯通過(guò)和運(yùn)行,還要稍加整理和添加一些東西
首先是相關(guān)的頭文件
#include#include#include#include
我們的思路:
編寫函數(shù)get_inode(char *file_name)得到相關(guān)文件的i-node
編寫函數(shù)inode_to_name(ino_t, char *, int)將我們得到的i-node轉(zhuǎn)化為文件的名字
編寫函數(shù)print_path(ino_t)將路徑名字打印出來(lái)。
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 }
這個(gè)函數(shù)返回指向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 }
最后一個(gè)就是將路徑名字打印出來(lái)啦
運(yùn)用的遞歸,沒(méi)有使用while循環(huán)操作
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 }簡(jiǎn)單說(shuō)說(shuō)這里的業(yè)務(wù)邏輯吧。
想想在shell中輸入pwd命令。。。。。。。。。。。。
開始執(zhí)行g(shù)et_inode( "." ),參數(shù)是當(dāng)前的工作目錄,返回值是當(dāng)前目錄的i-node號(hào),命名為this_inode.
將當(dāng)前目錄的i-node(即就是this_inode)和上一級(jí)目錄(父目錄)的i-node比較(上一級(jí)的i-node同樣是用get_inode( ".." )得到,只不過(guò)參數(shù)變成了"..")如果不相同的話,轉(zhuǎn)入上一級(jí)目錄,同時(shí)通過(guò)inode_to_name()函數(shù)將當(dāng)前的this_inode轉(zhuǎn)換為目錄的名字。chdir函數(shù)是改變進(jìn)程的工作目錄的,到達(dá)父目錄后,同樣的方法得到父目錄的i-node,(此時(shí)的父目錄就是當(dāng)前目錄了),遞歸調(diào)用print_path函數(shù)打印出路徑名稱。當(dāng)?shù)竭_(dá)根目錄的時(shí)候,由于根目錄的this_inode和它的父目錄的i-node是相同的,那么打印結(jié)束,整個(gè)業(yè)務(wù)流程結(jié)束。
總結(jié)
以上是生活随笔為你收集整理的linux中 pwd *****,linux命令自己写--pwd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 触摸屏mtp文件转c语言,F28335与
- 下一篇: -f shell 模糊匹配_linux模