C 리눅스 PWD 명령 달성

C 리눅스 PWD 명령 달성

PWD 명령 기능 도입

리눅스는 작업 디렉토리 표시 할 명령 PWD
PWD 명령을 실행을 바로 알고 경우 현재 작업 디렉토리의 절대 경로 이름.
:

귀하의 시스템 매뉴얼

  • 도시 된 바와 같이, getcwd내가 연구 있도록 설명을, 우리는 PWD 명령 기능이 매우 유사합니다 달성하고 싶다 "현재 작업 디렉토리를 얻을"입니다getcwd

  • 같이, 사용 및 설명은 그 기능에서 언급에 getcwd을 위해하는 것입니다 호출 프로그램이 절대 경로를 포함하는 위치의 끝에 널 문자 문자열을 반환 우리는 기능을 구현하기 위해 필요한 분명하다!

PWD 명령을 달성하기 위해 (a)

지금까지, 1 세대 mypwd 형성되었으며만큼가 프로그램에 사용될 getcwd()함수의 절대 경로를 얻는 기능을 달성 할 수있다.

다음은 C 언어 코드 mypwd의 실현

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    char buf[1024];

    char *cwd =getcwd(buf, sizeof(buf));

    if (NULL == cwd) {
        perror("Get cerrent working directory fail.\n");
        exit(-1);
    } else {
        printf("%s\n", cwd);
    }

    return 0;
}

테스트 결과

PWD 명령 (b)를 실현

첫 번째 세대 mypwd의 PWD 명령은 이미 기능을 얻을 수 있지만, 이것은 단지 그 기능을 수행 명확하게, 그리고 너무 왕따, 어떻게 작동하는지 나는 정보의 linux 디렉토리에 대한 참조를 계속하므로, 이해할 수없는

디렉토리에있는 파일을 조직의 리눅스 방법

파일 시스템에서는, 아이 노드 라는 파일 및 아이 노드를 나타내는데 사용되는 정수 값을 나타내고, 아이 노드 넘버 값은 대응하는 아이 노드 값을 통해 발견 될 수있는 파일 시스템, 고유 . 정상적인 상황에서, 파일은 그것을 설명하는 단 하나의 아이 노드 정보가 있습니다 .

이 학기, 우리는 개념을 강조하고있다 "리눅스에서 시스템을 모든 파일입니다" 그래서 파일, 그것이 아이 노드로 구성해야하는 디렉토리는 의심의 여지가있다.

因此,我们通常所说的目录a“包含”文件b,其实现层面上的意思是,目录a的内容列表里有一个关于文件b的列表项,即“b的inode-number+b的filename”。综上,Linux中,一个文件(包括目录)的文件名,及文件名与inode的对应关系,都是由包含该文件的目录所描述的。

伪代码

现在我们了解了可以实现工作目录与上级目录inode值的比对来判断是否追溯到根目录,为了实现这个上溯目录的功能,我们可以使用如图所示这个函数:

chdir("..")即可实现向上级目录跳转

定义用来存储路径的字符数组
通过特殊文件名“.”获得当前工作目录名称
chdir()返回上级目录
if(本目录inode-number和上级inode-number不同),本目录不是根目录,继续向上查找
else
是根目录,可以输出绝对路径了

详细代码

有了上述的思路,我们可以写出详细代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

ino_t get_inode(char*);
void printpathto(ino_t);
void inum_to_name(ino_t,char*,int);
int main()
{
    printpathto(get_inode("."));  //打印当前目录绝对路径
    putchar('\n');
    return 0;
}

void printpathto(ino_t this_inode)
{
    ino_t my_inode;
    char its_name[BUFSIZ];
    /*如果本目录的inode-number与上级目录不同,即本目录不是根目录*/
    if (get_inode("..")!=this_inode)                                 
    {
        chdir("..");         //进入上级目录
        inum_to_name(this_inode,its_name,BUFSIZ);
        my_inode = get_inode(".");
        printpathto(my_inode);
        printf("/%s",its_name);
    }
}
void inum_to_name(ino_t inode_to_find,char* namebuf,int buflen)   //找到inode-number节点对应的文件名,并放在字符数组里
{
    DIR* dir_ptr;
    struct dirent* direntp;
    dir_ptr = opendir(".");
    if (dir_ptr == NULL)
    {
        perror(".");
        exit(1);
    }
 
    while((direntp = readdir(dir_ptr)) != NULL)
    {
        if(direntp->d_ino == inode_to_find)
        {
            strncpy(namebuf,direntp->d_name,buflen);
            namebuf[buflen-1] = '\0';
            closedir( dir_ptr);
            return;
        }
    }
    fprintf( stderr , "error looking for inum % d\n" ,inode_to_find);
    exit (1) ;
}
ino_t get_inode(char* fname)            //根据文件名,返回inode-number
{
    struct stat info;
    if ( stat( fname, &info) == -1){
        fprintf( stderr , "Cannot stat ");
        perror(fname);
        exit (1);
    }
    return info.st_ino;
}

测试结果

参考资料

《Unix环境高级编程》
博客园连接

추천

출처www.cnblogs.com/darklord0604/p/12010196.html