20155212 C語言實現linux下pwd命令的兩種方法
學習pwd命令
- 通過
man pwd
命令查看
- pwd [OPTION],一般不加參數
- -P顯示當前目錄的物理路徑
- -L顯示當前目錄的連接路徑
- 該命令用來顯示目前所在的工作目錄。指令英文原義:print work directory
系統調用
- 使用
man -k dir | grep 2
命令查看有哪些跟pwd相關的系統調用

- 這里有兩個系統調用可能用到pwd中
- getcwd()
- 功能:獲取當前目錄
- 參數
- char *buf:存儲當前路徑的字符串
- size_t size:buf的空間大小
- 返回值: 成功則返回指向當前路徑字符串的指針,錯誤則返回NULL
- readdir()
- 但是發現readdir()不能單獨使用,
- opendir()
- 功能:opendir()用來打開參數name指定的目錄,並返回DIR*形態的目錄流,和open()類似,接下來對目錄的讀取和搜索都要使用此返回值
- 參數:路徑名
- 返回值:成功則返回DIR* 型態的目錄流,打開失敗則返回NULL。
- chdir()
偽代碼
定義數組buf[MAXPATH];
調用getcwd(buf, MAXPATH);
輸出返回值;
while(1)
{
讀取"."和".."的信息
if("."的inode==".."的inode)
{
退出;
}
else
{
chdir("..");
while(dirent->inode!=前面"."的inode)
{
dirent=readdir();
}
dirent->name入棧;
}
}
for 棧頂->棧底
print 棧頂信息
產品代碼
#include <stdio.h>
#include <unistd.h>
#define MAXPATH 50
int main()
{
char path[MAXPATH];
puts(getcwd(path, MAXPATH));
return 0;
}
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main()
{
DIR *dirptr=NULL;
struct dirent *current_dirent=NULL, *parent_dirent=NULL, *tmp_dirent=NULL;
int count=0;
ino_t current_inode;
char path[256][256];
while(1)
{
dirptr=opendir(".");
do
{
current_dirent=readdir(dirptr);
}while(strcmp(current_dirent->d_name, ".")!=0);
current_inode=current_dirent->d_ino;
closedir(dirptr);
dirptr=opendir(".");
do
{
parent_dirent=readdir(dirptr);
}while(strcmp(parent_dirent->d_name, "..")!=0);
closedir(dirptr);
if(((long)parent_dirent->d_ino)==((long)current_dirent->d_ino))
{
break;
}
else
{
chdir("..");
dirptr=opendir(".");
do
{
tmp_dirent=readdir(dirptr);
}while(tmp_dirent->d_ino!=current_inode);
closedir(dirptr);
count++;
strcpy(path[count], tmp_dirent->d_name);
}
}
int i;
for(i=count;i>0;i--)
{
printf("/%s", path[i]);
}
printf("\n");
return 0;
}
測試
- 實現一:使用getcwd()實現pwd

- 實現二:使用readdir()實現pwd
