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环境高级编程》
博客园连接