본문 바로가기
programming/Unix

[Unix Programming] 3. 파일 다루기

by je0nsye0n 2024. 12. 9.

파일 정보의 획득

  • 파일 관련 각종 정보를 알아볼 수 있는 시스템콜

int stat (const char *pathname, struct stat *buf);

int fstat (int filedes, struct stat *buf); // open된 파일에 대해

st_dev, st_ino : identifier (논리적 장치번호와 inode 번호)
st_mode : permission mode
st_nlink : link의 수
st_uid, st_gid : user의 uid와 gid
st_rdev : file이 장치인 경우만 사용
st_size : 논리적 크기
st_atime, st_mtime, st_ctime : file의 최근 access time, update time, stat 구조의 update time
st_blksize : I/O block 크기
st_blocks : 파일에 할당된 block의 수

 

Permission

  • if(s.st_mode&S_IRUSR) // 소유자 읽기 권한
  • if(S_ISREG(s.st_mode));
    • S_ISREG : 파일인지
    • S_ISDIR : 디렉토리인지
    • S_ISLNK : 링크가 있는지
    • S_ISUID : 04000인지 - 실행이 시작되면, 소유자의 uid가 euid가 된다.
    • S_ISGID : 02000인지 - 실행이 시작되면, 소유자의 gid가 egid가 된다.

 

사용자와 소유권

  • 소유권자 : 파일을 생성한 사람, user-id인 uid로 구분
  • 사용자 : 파일을 사용하는 사람, euid로 구분

 

access 시스템 호출

  • 특정 파일에 대한 읽기/쓰기/실행이 가능한지 확인하는 시스템콜
  • amode : R_OK , W_OK, X_OK, 또는 F_OK
  • euid가 아니라 uid에 근거하여 process가 file에 접근 가능한지를 표현;

int access (cosnt char *pathname, int amode);

return : 0 / -1

 

chmod

  • 특정 파일의 access permission을 변경하는 시스템콜 (소유자만 사용 가능)

int chmod(const char *pathname, mode_t mode);

int fchmod(int fd, mode_t mode);

 

link 시스템 호출

  • 기존 파일에 새로운 이름을 부여하는 시스템콜
    • 한 파일에 하나 이상의 이름 : 각 이름을 ‘hard link’라고 부름
    • link count : link의 수

int link (const char *original_path, const char *new_path);

return : 0 / -1(new path가 존재하는 경우)

  • 이름을 삭제하는 시스템콜 : unlink(”a.out”);
    • link를 제거 → link_count- -
    • 만약, link count가 0이 되면 실제로 제거(free block으로)

 

Symbolic link

  • symbol형 link :
    • link의 제한점 : 디렉토리에 대한 링크 생성 불가.
    → symbolic link (자체가 file; 그 안에 다른 file에 대한 경로 수록; )

int symlink(const char *realname, const char *symname);

return : 0 or -1(symname이 존재하면)

  • readlink 사용 : symname안에 있는 내용을 보고 싶으면.

int readlink (const char *symname, char *buffer, size_t buffsize);

  • lstat 사용 : symbolic link가 가리키는 파일이 아닌 symbolic link 자체의 파일 정보를 전달

int lstat (const char *linkname, struct stat *buf);