파일 접근 권한 제어
stat 구조체의 st_mode 항목에는 파일의 종류와 접근 권한 정보가 저장된다.
st_mode 항목의 값을 해석하려면 sys/stat.h파일에 정의된 상수와 매크로를 이용해야 한다.
st_mode의 구조
먼저, st_mode 항목에 저장되는 값의 구조를 알아야 상수와 매크로의 역할을 이해할 수 있다.
(st_mode: 파일의 종류와 접근권한 정보)
st_mode 항목의 데이터형인 mode_t는 unsigned int로 정의되어 실제로 16비트를 사용한다.
buf
- 파일의 상태 및 정보를 저장할 buf 구조체
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* 파일의 종류 및 접근권한 */
nlink_t st_nlink; /* hardlink 된 횟수 */
uid_t st_uid; /* 파일의 owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* 파일의 크기(bytes) */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
이 중에서 주요 내용을 보면,
st_mode : 파일의 종류와 file에 대한 access 권한 정보
파일의 종류 체크하는 POSIX macro입니다.
S_ISREG(buf.st_mode) : 일반 파일 여부
S_ISDIR(buf.st_mode) : 디렉토리 여부
S_ISCHR(buf.st_mode) : character device 여부
S_ISBLK(buf.st_mode) : block device 여부
S_ISFIFO(buf.st_mode) : FIFO 여부
S_ISLNK(buf.st_mode) : symbolic link 여부
S_ISSOCK(buf.st_mode) : socket 여부 (주로 AF_UNIX로 socket 생성된 경우)
st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
S_IFMT 0170000 파일 유형의 전체의 bit or 값
/* 파일 유형 */
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
/* 특수 권한 설정 bit */
S_ISUID 0004000 set-user-ID bit
S_ISGID 0002000 set-group-ID bit
S_ISVTX 0001000 sticky bit
접근 권한 값(chmod의 값과 같음)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
st_atime, st_mtime, st_ctime member 변수는 time관련 함수(time.h)를 이용하여 conversion후에
사용하면 쉽게 사용할 수 있습니다. localtime(3), ctime(3) 등
sys/stat.h 파일에 정의된 상수와 매크로는 16비트 구조로 저장된 값과 상수를 AND연산한 값을 추출하는 것이다.
파일의 종류 검색
1) 상수를 이용한 파일 종류 검색
st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
S_IFMT 0170000 // 파일 종류 비트를 가져오기 위한 비트 마스크
/* 파일의 유형 검색 상수 */
S_IFSOCK 0140000 // 소켓 파일 [socket]
S_IFLNK 0120000 // 심벌릭 링크 파일 [symbolic link]
S_IFREG 0100000 // 일반 파일 [regular file]
S_IFBLK 0060000 // 블록 장치 특수 파일 [block device]
S_IFDIR 0040000 // 디렉터리 [directory]
S_IFCHR 0020000 // 문자 장치 특수 파일 [character device]
S_IFIFO 0010000 // FIFO 파일
2) 매크로를 이용한 파일 종류 검색
st_mode는 파일의 유형값으로 직접 bit & 연산으로 여부를 확인가능합니다.
S_IFMT 0170000 // 파일 종류 비트를 가져오기 위한 비트 마스크
/* 파일의 종류 체크하는 POSIX macro */
S_ISREG(buf.st_mode) : 일반 파일 여부
S_ISDIR(buf.st_mode) : 디렉토리 여부
S_ISCHR(buf.st_mode) : character device 여부
S_ISBLK(buf.st_mode) : block device 여부
S_ISFIFO(buf.st_mode) : FIFO 여부
S_ISLNK(buf.st_mode) : symbolic link 여부
S_ISSOCK(buf.st_mode) : socket 여부 (주로 AF_UNIX로 socket 생성된 경우)
각 매크로는 인자로 받은 mode값을 0xF000과 AND연산한다.
파일 접근 권한 검색
파일의 접근 권한 역시 st_mode값으로 알 수 있으며, access()와 같은 함수를 활용할 수도 있다.
1. 상수를 이용한 파일 접근 권한 검색
/* 특수 권한 설정 bit */ (st_mode 값과 AND 연산으로 설정/권한 확인)
S_ISUID 0004000 set-user-ID bit
S_ISGID 0002000 set-group-ID bit
S_ISVTX 0001000 sticky bit
파일의 접근 권한 검색 상수
S_IREAD 00400 owner read permission bit (8bit)
S_IWRITE 00200 owner write permission bit (8bit)
S_IEXEC 00100 owner execute permission bit (8bit)
파일의 접근 권한 상수(POSIX, chmod의 값과 같음)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
2. 함수를 이용한 접근 권한 검색 : access(2)
access()함수는 pathname에 지정된 파일이 mode로 지정한 권한을 지니고있는지 확인하고 반환한다.
(단, EUID(Effective User ID, 유효 사용자 ID)가 아닌 RUID(Real User ID, 실제 사용자 ID)에 대한 접근권한만 확인 가능.
#include <unistd.h>
int access(const *pathname, int mode);
pathname : 접근 권한을 알고자 하는 파일의 경로, mode : 접근 권한
두 번째 인자 mode에 사용할 수 있는 상수는 unistd.h 파일에 정의되어있다.
R_OK // 읽기 권한 확인
W_OK // 쓰기 권한 확인
X_OK // 실행 권한 확인
F_OK // 파일 유무 확인
파일 접근 권한 변경
파일의 접근 권한을 명경할때 사용하는 명령도 chmod이고, 이에 해당하는 시스템 호출도 chmod()이다.
1. 파일 명으로 접근 권한 변경 : chmod(2)
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
pathname : 접근 권한을 변경하려는 파일의 경로, mode : 접근 권한
chmod() 함수는 접근 권한을 변경할 파일의 경로를 받아 mode에 지정한 상수값으로 권한을 변경한다.
기존 접근 권한을 모두 새로 지정하려면 상수를 이용하여 권한을 생성한 후 인자로 지정한다.
chmod(pathname, S_IRWXU);
chmod(pathname, S_IRWXU | S_IRGRP | S)IXGRP | S_IROTH);
기존 접근 권한을 더할 때는 OR 연산자를 사용한다.
mode |= S_IWGRP;
기존 접근 권한을 제거할 때는 NOT, AND 연산자를 사용한다.
mode &= ~(S_IROTH);
mode값을 변경한 후 chmod() 함수를 호출해야 변경된 접근 권한이 적용된다.
chmod(pathname, mode);
2. 파일 기술자로 접근 권한 변경 : fchmod(2)
#include <sys/stat.h>
int fchmod(int fd, mode_t mode);
fd : 열려 있는 파일의 파일 기술자, mode : 접근 권한
'Fundamental of Software Develop > : : Linux System Programming' 카테고리의 다른 글
Linux System Programming : 링크 파일 생성 (0) | 2023.11.10 |
---|---|
Linux System Programming: 파일 정보 검색 (0) | 2023.11.10 |
디렉터리 내용 읽기 (0) | 2023.11.09 |
디렉터리 관리하기 (위치 검색, 이름 변경, 이동) (0) | 2023.11.09 |
디렉터리 생성과 삭제 : mkdir(), rmdir() (0) | 2023.11.09 |