PWD 명령을 배울 수
PWD 명령을 알아보기 (1)
PWD 명령 함수 여기서 출력 현재 디렉토리 절대 경로 이름.
절대 및 상대 경로 :
绝对路径:从根目录开始直到文件位置
相对路径:相对于程序当前所在目录到文件位置
例:程序运行在C:/user/dell下,假设有一个文件test.txt
绝对路径:C:/user/dell/test.txt
相对路径:./test.txt
귀하의 시스템 매뉴얼
- 우리는 먼저
man pwd
자세한 기능 PWD 명령을 참조하십시오
- 참조 PWD 구현은 각각 두 개의 매개 변수를 가지고
man -l
, 그리고man -p
pwd -l
PWD는 심볼릭 링크를 포함하는 경우에도, 환경에서 기능을 수행하는 명령;pwd -p
기능, 모든 심볼릭 링크를 방지 PWD 명령을 수행 할 수 있습니다.
- 특별한 심볼 링크 경로 때문에, 그래서 두 개의 명령 실행 결과 사이에 차이가 없습니다
- 입력합니다
man -k dir \ grep 2
, 우리는 getpwd 기능을 찾을 수있는 시스템 호출을보고, 함수는 현재 작업 디렉토리를 얻을 수 있습니다
- 이어서
man getcwd
시청 기능에 getcwd 함수 지령char *getcwd(char *buf, size_t size);
함수의 첫 번째 인수는 어레이의 제 2 공간 파라미터 값의 선두 어드레스이고;- 이 기능은 널 종료, 절대 경로 이름이 포함 된 문자열을 반환 경로는 호출 프로세스의 현재 작업 디렉토리입니다.
에 getcwd 함수를 사용 PWD 명령 구현
다음 코드는
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
char buf[1024];
char *cwd =getcwd(buf, sizeof(buf));
if (cwd == NULL) {
perror("Get cerrent working directory fail.\n");
exit(-1);
} else {
printf("%s\n", cwd);
}
return 0;
}
테스트 결과
달성 PWD 명령 ICODE 번호 값
- 문서로서 또, 출력 할 수도 절대 경로 ICODE 값
의사 코드
获取初始目录名称
next:
获取当前目录的icode_number
通过chdir() 返回上一级目录
获得上一级目录的icode_number_ago
icode_number==icode_number_ago ?
不相等:
获取当前目录名称
返回next
相等
已经找到根目录,输出绝对路径
다음 코드는
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
ino_t get_inode(char*);
void print(ino_t);
void inum_to_name(ino_t,char*,int);
int main()
{
ino_t node=get_inode(".");
print(node); //打印当前目录绝对路径
putchar('\n');
return 0;
}
void print(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(".");
print(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;
}