본문 바로가기

C

[시스템프로그래밍] ch.4 pwd 복습

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);
}