pwd: 디렉토리 트리 형식으로 현재 위치 보여주는 명령어
공부할거
- mkdir, rmdir, chdir
- link, unlink, rename, symlink
- 디렉토리가 연결되는 방식
- pwd가 어떻게 작동하는가
- Mounting file system
mkdir : 디렉토리 만들기
rmdir : 디렉토리 삭제
mv : 디렉토리 이름을 바꾸거나, 파일위치가 이동한다
cd : 다른 디렉토리로 위치를 이동한다
.. : 부모 디렉토리
$ cd ../..
ls -R : 모든 디렉터리와 하위 디렉터리들을 보여준다.
chmod -R : 파일의 접근 권한을 바꾼다. 하위 디렉터리 파일의 권한까지 모두 바꾼다
du : disk usage. 디렉터리가 사용한 디스크 블럭의 수를 보여준다.
find : 파일 및 디렉토리 검색
ln -s
심볼릭 링크를 만든다.
심볼릭 링크는 다른 inode를 가짐
ls -s whoson users
users는 whoson의 심볼릭링크며, 모드 맨 앞에 l 이 붙는다
cross-device links
다른 파일 시스템 간에 동일한 파일에 하드 링크를 생성하는 것은 일반적으로 불가능
하드 링크: cross-device link 불가
심볼릭 링크: 다른 파일 시스템 간에 파일 또는 디렉터리를 가리키는 데 사용될 수 있으며, 이로써 다른 파일 시스템의 파일에 대한 참조를 만들 수 있습니다.
서로 다른 디스크 또는 파티션을 사용하는 이유?
파티션을 나누어 서로 다른 디스크를 사용하는 가장 주요한 이유는 "데이터 관리와 격리"입니다. 이를 통해 데이터를 논리적으로 분리하여 관리하고, 데이터 손실 또는 오작동이 한 파티션에서 다른 파티션으로 확산되는 것을 방지할 수 있습니다.
pwd 구현에 필요한 함수
ino_t get_inode(char *fname);
파일의 inode를 반환하는 함수
void printpathto(ino_t this_inode);
지정된 inode를 갖는 객체로 이어지는 경로를 출력하는 함수
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen);
현재 디렉터리에서 지정된 inode를 가진 파일의 이름을 namebuf 문자열에 복사하는 함수
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
ino_t get_inode(char *); //파일의 inode를 반환하는 함수
void printpathto(ino_t); //inode에 따라 경로를 출력하는 함수
void inum_to_name(ino_t, char *, int); //inode를 파일 이름으로 변환하는 함수
int main() {
printpathto(get_inode(".")); // 현재 디렉터리의 inode를 얻어 경로 출력하는 함수를 호출
putchar('\n');
return 0;
}
ino_t get_inode(char *fname) {
// 파일의 inode를 반환하는 함수
struct stat info;
if(stat(fname, &info) == -1) { //파일 정보 불러오기, 실패 시 오류 메시지 출력
fprintf(stderr, "Cannot stat ");
perror(fname);
exit(1);
}
return info.st_ino; // 파일의 inode 반환
}
void printpathto(ino_t this_inode) {
// 지정된 inode를 갖는 객체로 이어지는 경로를 출력하는 함수
ino_t my_inode;
char its_name[BUFSIZ];
if (get_inode("..") != this_inode) { //루트 디렉터리에 도달할 때까지
chdir(".."); // 상위 디렉터리로 이동
inum_to_name(this_inode, its_name, BUFSIZ); // 현재 inode에 해당하는 파일명 얻기
my_inode = get_inode("."); // 현재 디렉터리의 inode 얻기
printpathto(my_inode); // 재귀적으로 상위 디렉터리로 이동하여 경로를 출력하고
printf("/%s", its_name); // 뒤에 파일 이름을 출력
}
}
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen) {
// 현재 디렉터리에서 지정된 inode를 가진 파일의 이름을 namebuf 문자열에 복사하는 함수
DIR *dir_ptr; // 디렉터리 포인터
struct dirent *direntp; // 디렉터리 각 항목에 대한 포인터
dir_ptr = opendir("."); // 현재 디렉터리 열기, 실패 시 오류 메시지 출력
if (dir_ptr == NULL) {
perror(".");
exit(1);
}
// 지정된 inode를 갖는 파일을 찾아 반환
while ((direntp = readdir(dir_ptr)) != NULL)
if (direntp->d_ino == inode_to_find) { // inode 일치하는 경우 디렉터리명 복사
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);
}
'C' 카테고리의 다른 글
[시스템프로그래밍] ls 명령어 구현 (-al, -alR) (0) | 2023.10.13 |
---|---|
[시스템프로그래밍] File Handling, Files in multi-user environment (0) | 2023.10.13 |