日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

linux中 pwd *****,linux命令自己写--pwd

發(fā)布時(shí)間:2025/3/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中 pwd *****,linux命令自己写--pwd 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其實(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。