20155212 C語言實現linux下pwd命令的兩種方法


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()返回參數dir目錄流的下個目錄進入點
      • 參數:DIR * dir。結構dirent定義如下:
        struct dirent{
            ino_t d_ino;//此目錄進入點的inode
            off_t d_off;//目錄文件開頭至此目錄進入點的位移
            unsigned short int d_reclen;//記錄的長度
            unsigned char d_type;//文件類型
            char d_name[256];
        };
        
      • 返回值:成功則返回下個目錄進入點。有錯誤發生或讀取到目錄文件尾則返回NULL
  • 但是發現readdir()不能單獨使用,
    • opendir()
      • 功能:opendir()用來打開參數name指定的目錄,並返回DIR*形態的目錄流,和open()類似,接下來對目錄的讀取和搜索都要使用此返回值
      • 參數:路徑名
      • 返回值:成功則返回DIR* 型態的目錄流,打開失敗則返回NULL。
    • chdir()
      • 功能:切換當前目錄
      • 參數:路徑名

偽代碼

  • 使用getcwd()
定義數組buf[MAXPATH];
調用getcwd(buf, MAXPATH);
輸出返回值;
  • 使用readdir()
while(1)
{
    讀取"."和".."的信息
    if("."的inode==".."的inode)
    {
        退出;
    }
    else
    {
        chdir("..");
        while(dirent->inode!=前面"."的inode)
        {
            dirent=readdir();
        }
        dirent->name入棧;
    }
}
for 棧頂->棧底
    print 棧頂信息

產品代碼

  • 使用getcwd()
#include <stdio.h>
#include <unistd.h>
#define MAXPATH 50

int main()
{
    char path[MAXPATH];
    puts(getcwd(path, MAXPATH));
    return 0;
}

  • 使用readdir()
#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

碼雲鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM