시스템 프로그래밍[4-6]

Turtle·2024년 4월 14일
0
post-thumbnail

❓파일 상태 - stat()

  • 파일에 대한 모든 정보
  • 블록 수, 파일 타입, 사용 권한, 링크 수, 파일 소유자의 사용자 ID
  • 그룹 ID, 파일 크기, 최종 수정 시간
  • 파일 상태 정보를 보려면 stat()를 사용한다.
int stat (const char *filename, struct stat *buf);
int fstat (int fd, struct stat *buf);
int lstat (const char *filename, struct stat *buf)
  • 파일의 상태 정보를 가져와서 stat 구조체 buf에 저장하는데 이 때 성공하면 0을, 실패하면 -1을 리턴한다.

❓파일 타입 검사 함수

  • 일반 파일 → S_ISREG()
  • 디렉터리 파일 → S_ISDIR()
  • 문자 장치 파일 → S_ISCHR()
  • 블록 장치 파일 → S_ISBLK()
  • FIFO 파일 → S_ISFIFO()
  • 소켓 → S_ISSOCK()
  • 심볼릭 링크 → S_ISLINK()

❓접근권한 변경 - chmod(), fchmod()

  • chmod()는 일전에도 배웠던 함수로 이는 권한을 변경할 때 사용되는 함수다.
#include <sys/stat.h>
#include <sys/types.h>
int chmod (const char *path, mode_t mode );
int fchmod (int fd, mode_t mode );

❓접근 및 수정 시간 변경 - utime()

#include <sys/types.h>
#include <utime.h>
int utime (const char *filename, const struct utimbuf *times );
  • 파일의 최종 접근 시간과 최종 변경 시간을 조정한다.
  • times가 NULL이면 현재 시간으로 설정된다.

❓파일 소유자 변경 - chown()

  • chown()는 일전에도 배웠던 함수로 이는 소유자를 변경할 때 사용되는 함수다.
#include <sys/types.h>
#include <unistd.h>
int chown (const char *path, uid_t owner, gid_t group );
int fchown (int filedes, uid_t owner, gid_t group );
int lchown (const char *path, uid_t owner, gid_t group );

❓디렉터리 리스트

  • opendir() : 디렉터리 열기 함수
  • DIR 포인터 리턴
  • readdir() : 디렉터리 읽기 함수
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *path);
struct dirent *readdir(DIR *dp);
  • path 디렉터리를 열어(opendir()) 성공하면 DIR 구조체 포인터를, 실패하면 NULL을 리턴
  • 한 번에 디렉터리엔트리(=dirent)를 하나씩 읽어(readdir())서 리턴

❓디렉터리 생성 - mkdir()

  • mkdir() 시스템 호출
#include <sys/types.h>
#include <sys/stat.h>
int mkdir (const char *path, mode_t mode );
  • 새로운 디렉터리를 만드는데 mkdir()을 사용하고 이 때, 성공하면 0을, 실패하면 -1을 리턴한다.

❓디렉터리 삭제 - rmdir()

  • rmdir() 시스템 호출
#include <unistd.h>
int rmdir (const char *path);
  • 디렉터리가 비어있으면 삭제하는데 이 때, 성공하면 0을, 실패하면 -1을 리턴한다.
  • rmrmdir

❓하드링크와 심볼릭링크

  • 링크는 기존 파일에 대한 또 다른 이름으로 link() 함수를 사용한다.
#include <unistd.h>
int link(char *existing, char *new);
int unlink(char *path);

하드링크는 원본파일과 동일한 inode를 직접적으로 가리킨다. 따라서 원본이 삭제되더라도 원본과 동일한 내용의 파일을 하나 더 가지고 있기 때문에 자원을 공유하면서 데이터를 안전하게 관리할 때 주로 사용된다.
하지만 하드링크는 파일 링크만 가능하며 디렉터리 링크는 불가능하다.
하드링크의 단점을 보완하기 위해서 심볼릭링크가 등장했다. 심볼릭링크는 실제 파일의 경로명 자체를 저장하고 있는 링크다. 심볼릭링크는 파일이나 디렉터리를 가리키는 포인터를 가져 둘 다 참조가 가능하다. 하지만 심볼릭링크는 원본이 삭제된 경우 해당 파일로 갈 수 있는 경로명을 가지는 심볼릭링크가 있다 하더라도 데이터가 삭제되었기 때문에 원본이 삭제되면 해당 데이터에 접근하는 것은 불가능하다.

❓파일 잠금 - flock()

#include <sys/file.h>
int flock(int fd, int operation)
  • LOCK_SH : 공유 잠금으로 한 개 이상의 프로세스들이 파일에 대한 공유 잠금이 가능하다.
  • LOCK_EX : 배타 잠금으로 한번에 하나의 프로세스만이 파일에 대한 배타 잠금을 할 수 있다.
  • LOCK_UN : 파일에 걸려 있는 잠금을 해제한다.
  • LOCK_NB : 파일에 잠금이 걸려 있으면 기다리지 않고 반환하며 이런 경우에 errno
    에 EWOULBLOCK가 설정된다. 잠금을 확인하고 다른 일을 할 때 유용하다.

※ 공유 잠금 : 데이터를 읽을 때 사용되는 잠금이다.
※ 배타 잠금 : 데이터를 변경할 때 사용하며 트랜잭션이 완료될 때까지 유지된다.

❓잠금 - fcntl()[시스템 호출], lockf()[함수]

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, struct flock *lock);
// fd : file descriptor(파일 디스크립터)
// cmd : 옵션
// flock구조체 : 잠금 종류, 프로세스 ID, 잠금 위치
#include <unistd.h>
int lockf(int fd, int cmd, off_t len);

0개의 댓글