고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 4편: 파일과 디렉터리의 권한 설정
안녕하세요, C 언어로 시스템 프로그래밍까지 마스터하고 싶은 여러분! 😎
오늘은 조금 더 깊은 주제로 파일과 디렉터리의 권한 설정에 대해 알아보겠습니다.
🔐 파일 권한은 마치 “문에 달린 자물쇠” 같아요.
누가 열 수 있는지, 누가 쓸 수 있는지 명확히 지정해줘야 안전하답니다!
C 언어에서는 시스템 호출을 통해
파일을 누가 읽고 쓸 수 있는지, 디렉터리를 누가 접근할 수 있는지 등을 정할 수 있어요.
1. 권한(permission)이란?
유닉스(리눅스) 시스템에서는 각 파일과 디렉터리에 소유자와 권한이 설정되어 있습니다.
기본 권한 분류
- 소유자(owner): 파일을 만든 사용자
- 그룹(group): 해당 파일에 속한 사용자 그룹
- 기타(other): 나머지 모든 사용자
권한 종류
기호 | 권한 | 설명 |
---|---|---|
r |
읽기 (read) | 파일 내용을 읽을 수 있음 |
w |
쓰기 (write) | 파일 내용을 수정할 수 있음 |
x |
실행 (execute) | 실행 가능한 파일, 또는 디렉터리 접근 가능 |
2. 권한 숫자 표기법 (8진수)
권한은 8진수로 표현하며, r=4
, w=2
, x=1
의 값을 합산합니다.
권한 조합 | 숫자 |
---|---|
rwx |
7 (4+2+1) |
rw- |
6 (4+2) |
r-- |
4 |
r-x |
5 (4+1) |
예: chmod 755
→ 소유자: rwx
, 그룹: rx
, 기타: rx
3. 파일 생성 시 권한 지정: open()
또는 fopen()
과 umask
C 언어에서 파일을 생성할 때 기본적으로 권한은 시스템의 umask 값에 따라 결정됩니다.
open()
함수 (POSIX)
#include <fcntl.h>
#include <sys/stat.h>
int fd = open("test.txt", O_CREAT | O_WRONLY, 0644);
0644
: 소유자rw
, 그룹과 기타r
⚠️
fopen()
은 내부적으로open()
을 호출하므로 직접 권한 제어가 어려움
대신umask()
로 기본값을 설정할 수 있어요.
4. 디렉터리 생성 시 권한 설정: mkdir()
#include <sys/stat.h>
#include <sys/types.h>
mkdir("myfolder", 0755);
0755
: 소유자rwx
, 그룹과 기타rx
- 디렉터리는 실행(x) 권한이 있어야 접근 가능합니다!
📁 디렉터리에
x
권한이 없으면cd
로 진입할 수 없어요!
5. 권한 변경: chmod()
#include <sys/stat.h>
chmod("filename.txt", 0644);
chmod("myfolder", 0755);
chmod()
함수로 파일이나 디렉터리의 권한을 변경할 수 있어요.- 성공 시 0, 실패 시 -1 반환
6. 파일 소유자 변경: chown()
(관리자 권한 필요)
#include <unistd.h>
#include <sys/types.h>
chown("file.txt", new_uid, new_gid);
- 소유자 또는 그룹을 변경
- 일반 사용자는 자신의 파일이라도
chown()
사용 불가 → root 권한 필요
7. 파일 권한 확인: stat()
함수
#include <sys/stat.h>
#include <stdio.h>
struct stat st;
stat("file.txt", &st);
printf("권한: %o
", st.st_mode & 0777);
🔍
stat()
을 이용하면 현재 파일의 권한을 숫자로 확인할 수 있어요.
8. 예제: 디렉터리 만들고 권한 설정하기
#include <stdio.h>
#include <sys/stat.h>
int main() {
int result = mkdir("secure_dir", 0700);
if (result == 0) {
printf("디렉터리 생성 완료
");
} else {
perror("디렉터리 생성 실패");
}
chmod("secure_dir", 0755); // 나중에 권한 조정
return 0;
}
📌 처음에는 제한된 권한으로 만들고,
나중에 상황에 따라 조정하는 것이 보안에 더 좋아요!
9. 윈도우에서는 어떻게 하나요?
Windows에서는 C 표준 함수로는 권한을 직접 다루기 어렵고,
Windows API (SetFileSecurity
, GetFileAttributesEx
등)를 사용해야 합니다.
따라서 파일 권한 설정은 유닉스 계열 시스템에서 더 많이 사용되는 기능이에요.
10. 실전 사용 시 주의할 점
주의사항 | 설명 |
---|---|
무조건 0777 사용 금지 | 보안상 모든 사용자에게 rwx 권한은 매우 위험합니다! |
x 권한 없는 디렉터리 |
내부로 접근 자체가 불가능함 |
chmod() 호출 오류 |
파일이 없거나 권한이 없을 경우 발생 |
stat() 반환값 확인 |
반드시 존재 여부 체크 후 사용 |
디렉터리 삭제 전에 rwx 확인 |
디렉터리 내부 파일 권한도 중요 |
✅ 요약 정리
기능 | 함수 | 예시 |
---|---|---|
권한 부여 | open() |
open("file", O_CREAT, 0644) |
디렉터리 생성 | mkdir() |
mkdir("dir", 0755) |
권한 변경 | chmod() |
chmod("file", 0644) |
권한 조회 | stat() |
stat("file", &st) |
소유자 변경 | chown() |
chown("file", uid, gid) |
마무리하며 💬
C 언어에서 권한 설정은 단순히 파일을 만들고 읽는 수준을 넘어서
시스템 자원 보호, 보안 설정, 협업 환경 제어를 위한 필수 능력입니다.
🎯 “파일을 만들 줄 아는 건 개발자고,
파일을 지킬 줄 아는 건 프로그래머다!”
다음 시간에는 실제 예제를 기반으로
파일 검색, 필터링, 자동 정리 프로그램 만들기로 이어서
실전 프로젝트에 응용해볼게요!
끝까지 함께 하신 여러분 최고입니다! 💪📂🔐