파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.

Slides:



Advertisements
Similar presentations
2. 파일 시스템 파일 디렉터리와 경로명 파일 시스템의 구조 새로운 파일 생성 소유권과 허가 파일 유형과 일반화.
Advertisements

6 레이스 컨디션.
Chapter 3 /etc/passwd real uid(진짜 사용자 식별번호), real gid(진짜 그룹 식별번호)
파일 시스템 및 디렉토리 ©숙대 창병모.
Department of Computer Engineering
9 파이프.
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 개요 가상 디바이스드라이버 실습
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
Linux System Programming
1 유닉스 시스템 프로그래밍 개요.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
6 프로세스 생성과 실행.
5장 파일 시스템.
6 프로세스 생성과 실행.
Department of Computer Science and Engineering
조 병 규 Software Quality Lab. 한국교통대학교
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
레이스 컨디션.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
Department of Computer Engineering
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
3 파일과 디렉토리.
Linux/UNIX Programming APUE (Files & Directories)
Linux/UNIX Programming APUE (Files & Directories)
4장 파일의 관리 서론 예제 프로그램 함수 - umask - access
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
8 메모리 매핑.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
4장 파일.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Department of Computer Engineering
14장. 포인터와 함수에 대한 이해.
FILE I/O 번째주 Dept. of Computer Science & Engineering
Department of Computer Engineering
5 프로세스 정보.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
문자 디바이스 드라이버 임베디드 시스템.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
네트워크 프로그래밍의 이해 School of Electronics and Information.
제어문 & 반복문 C스터디 2주차.
3 파일과 디렉토리.
화면 갈무리 및 파일 권한 설정.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
 파일 아카이브와 압축 명령 익히기.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
시스템 인터페이스 Lab1 X-window 및 명령어 사용.
구조체(struct)와 공용체(union)
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
9 파이프.
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
3장 파일 다루기 한빛미디어(주).
시스템 해킹과 보안 permission과 SetUID.
Presentation transcript:

파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조

파일 종류 검색[1] 상수를 이용한 파일 종류 검색 파일의 종류 검색 관련 상수 st_mode 값과 상수값을 AND(&) 연산하면 파일의 종류 부분만 남게 된다.

[예제 3-3] 상수를 이용해 파일 종류 검색하기 (test1.c) ex3_3.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 int kind; 08 09 stat("unix.txt", &buf); 10 11 printf("Mode = %o (16진수: %x)\n", (unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 12 13 kind = buf.st_mode & S_IFMT; 14 printf("Kind = %x\n", kind); 15 16 switch (kind) { 17 case S_IFIFO: 18 printf("unix.txt : FIFO\n"); 19 break; 20 case S_IFDIR: 21 printf("unix.txt : Directory\n"); 22 break;

[예제 3-3] 상수를 이용해 파일 종류 검색하기 # ex3_3.out Mode = 100644 (16진수: 81a4) 23 case S_IFREG: 24 printf("unix.txt : Regular File\n"); 25 break; 26 } 27 28 return 0; 29 } # ex3_3.out Mode = 100644 (16진수: 81a4) Kind = 8000 unix.txt : Regular File

파일 종류 검색[2] 매크로를 이용한 파일 종류 검색 각 매크로는 인자로 받은 mode 값을 0xF000과 AND연산 수행 이 매크로는 POSIX 표준

[예제 3-4] 매크로를 이용해 파일 종류 검색하기 (test2.c) ex3_4.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 printf("Mode = %o (16진수: %x)\n",(unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 11 12 if(S_ISFIFO(buf.st_mode)) printf("unix.txt : FIFO\n"); 13 if(S_ISDIR(buf.st_mode)) printf("unix.txt : Directory\n"); 14 if(S_ISREG(buf.st_mode)) printf("unix.txt : Regualr File\n"); 15 16 return 0; 17 } # ex3_4.out Mode = 100644 (16진수: 81a4) unix.txt : Regular File

파일 접근 권한 검색[1] 상수를 이용한 파일 접근 권한 검색 소유자의 접근권한 추출과 관련된 상수만 정의 소유자 외 그룹과 기타사용자의 접근권한은? st_mode의 값을 왼쪽으로 3비트 이동시키거나 상수값을 오른쪽으로 3비트 이동시켜 AND 수행 st_mode & (S_IREAD >> 3)

시프트 연산없이 직접 AND 연산이 가능한 상수 정의 파일 접근 권한 검색[2] POSIX에서 정의한 접근권한 검색 관련 상수 시프트 연산없이 직접 AND 연산이 가능한 상수 정의

[예제 3-5] 상수를 이용해 파일 접근 권한 검색하기 (test3.c) ex3_5.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 stat("unix.txt", &buf); 09 printf("Mode = %o (16진수: %x)\n", (unsigned int)buf.st_mode, (unsigned int)buf.st_mode); 10 11 if ((buf.st_mode & S_IREAD) != 0) 12 printf("unix.txt : user has a read permission\n"); 13 14 if ((buf.st_mode & (S_IREAD >> 3)) != 0) 15 printf("unix.txt : group has a read permission\n"); 16 17 if ((buf.st_mode & S_IROTH) != 0) 18 printf("unix.txt : other have a read permission\n"); 19 20 return 0; 21 } # ex3_5.out Mode = 100644 (16진수: 81a4) unix.txt : user has a read permission unix.txt : group has a read permission unix.txt : other have a read permission

함수를 사용한 파일 접근 권한 검색 : access(2) 파일 접근 권한 검색[3] 함수를 사용한 파일 접근 권한 검색 : access(2) path에 지정된 파일이 amode로 지정한 권한을 가졌는지 확인하고 리턴 접근권한이 있으면 0을, 오류가 있으면 -1을 리턴 오류메시지 ENOENT : 파일이 없음 EACCESS : 접근권한이 없음 amode 값 R_OK : 읽기 권한 확인 W_OK : 쓰기 권한 확인 X_OK : 실행 권한 확인 F_OK : 파일이 존재하는지 확인 #include <unistd.h> int access(const char *path, int amode);

[예제 3-6] access 함수를 이용해 접근 권한 검색하기 (test4.c) 01 #include <sys/errno.h> 02 #include <unistd.h> 03 #include <stdio.h> 04 05 extern int errno; 06 07 int main(void) { 08 int per; 09 10 if (access("unix.bak", F_OK) == -1 && errno == ENOENT) 11 printf("unix.bak: File not exist.\n"); 12 13 per = access("unix.txt", R_OK); 14 if (per == 0) 15 printf("unix.txt: Read permission is permitted.\n"); 16 else if (per == -1 && errno == EACCES) 17 printf("unix.txt: Read permission is not permitted.\n"); 18 19 return 0; 20 } # ls -l unix* -rw-r--r-- 1 root other 24 1월 8일 15:47 unix.txt # ex3_6.out unix.bak: File not exist. unix.txt: Read permission is permitted.

파일 기술자로 접근 권한 변경 : fchmod(2) 파일 접근권한 변경 파일명으로 접근권한 변경 : chmod(2) path에 지정한 파일의 접근권한을 mode값에 따라 변경 접근권한을 더할 때는 OR연산자를, 뺄 때는 NOT연산 후 AND 연산자 사용 chmod(path, S_ORWXU); chmod(path, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH); mode |= S_IWGRP; mode &= ~(S_IROTH); 파일 기술자로 접근 권한 변경 : fchmod(2) #include <sys/types.h> #include <sys/stat.h> int chmod(const char *path, mode_t mode); mode 값 설정 후 chmod(path, mode) 잊지말기! #include <sys/types.h> #include <sys/stat.h> int fchmod(int fd, mode_t mode);

[예제 3-7] chmod 함수 사용하기 (test5.c) ex3_7.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct stat buf; 07 08 chmod("unix.txt", S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH); 09 stat("unix.txt", &buf); 10 printf("1.Mode = %o\n", (unsigned int)buf.st_mode); 11 12 buf.st_mode |= S_IWGRP; 13 buf.st_mode &= ~(S_IROTH); 14 chmod("unix.txt", buf.st_mode); 15 stat("unix.txt", &buf); 16 printf("2.Mode = %o\n", (unsigned int)buf.st_mode); 17 18 return 0; 19 } mode값에 따라 권한이 어떻게 바뀌었나? # ls -l unix.txt -rw-r--r-- 1 root other 24 1월 8일 15:47 unix.txt # ex3_7.out 1.Mode = 100754 2.Mode = 100770 -rwxrwx--- 1 root other 24 1월 8일 15:47 unix.txt

링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름 같은 파일/디렉토리지만 여러 이름으로 접근할 수 있게 한다 하드링크 : 기존 파일과 동일한 inode 사용, inode에 저장된 링크 개수 증가 심볼릭 링크 : 기존 파일에 접근하는 다른 파일 생성(다른 inode 사용) 하드링크 생성 : link(2) 두 경로는 같은 파일시스템에 존재해야 함 #include <unistd.h> int link(const char *existing, const char *new);

[예제 3-8] link 함수 사용하기 (test6.c) ex3_8.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 #include <stdio.h> 05 06 int main(void) { 07 struct stat buf; 08 09 stat("unix.txt", &buf); 10 printf("Before Link Count = %d\n", (int)buf.st_nlink); 11 12 link("unix.txt", "unix.ln"); 13 14 stat("unix.txt", &buf); 15 printf("After Link Count = %d\n", (int)buf.st_nlink); 16 17 return 0; 18 } # ls -l unix* -rwxrwx--- 1 root other 24 1월 8일 15:47 unix.txt # ex3_8.out Before Link Count = 1 After Link Count = 2 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt

링크 파일 생성[2] 심볼릭 링크 생성 : symlink(2) #include <unistd.h> int symlink(const char *name1, const char *name2); 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 05 int main(void) { 06 symlink("unix.txt", "unix.sym"); 07 08 return 0; 09 } [예제 3-9] symlink 함수 사용하기 (test7.c) ex3_9.c # ls -l unix* -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt # ex3_9.out lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym -> unix.txt

심볼릭 링크의 내용 읽기 : readlink(2) 심볼릭 링크 정보 검색 심볼릭 링크 정보 검색 : lstat(2) lstat : 심볼릭 링크 자체의 파일 정보 검색 심볼릭 링크를 stat 함수로 검색하면 원본 파일에 대한 정보가 검색된다. 심볼릭 링크의 내용 읽기 : readlink(2) 심볼릭 링크의 데이터 블록에 저장된 내용 읽기 원본 파일의 경로 읽기 : realpath(3) 심볼릭 링크가 가리키는 원본 파일의 실제 경로명 출력 #include <sys/types.h> #include <sys/stat.h> int lstat(const char *path, struct stat *buf); #include <unistd.h> ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsiz); #include <stdlib.h> char *realpath(const char *restrict file_name, char *restrict resolved_name);

[예제 3-10] lstat 함수 사용하기 (test8.c) ex3_10.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <unistd.h> 04 #include <stdio.h> 05 06 int main(void) { 07 struct stat buf; 08 09 printf("1. stat : unix.txt ---\n"); 10 stat("unix.txt", &buf); 11 printf("unix.txt : Link Count = %d\n", (int)buf.st_nlink); 12 printf("unix.txt : Inode = %d\n", (int)buf.st_ino); 13 14 printf("2. stat : unix.sym ---\n"); 15 stat("unix.sym", &buf); 16 printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); 17 printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 18 19 printf("3. lstat : unix.sym ---\n"); 20 lstat("unix.sym", &buf);

[예제 3-10] lstat 함수 사용하기 21 printf("unix.sym : Link Count = %d\n", (int)buf.st_nlink); 22 printf("unix.sym : Inode = %d\n", (int)buf.st_ino); 23 24 return 0; 25 } # ls -li unix* 192 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.ln 202 lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym->unix.txt 192 -rwxrwx--- 2 root other 24 1월 8일 15:47 unix.txt # ex3_10.out 1. stat : unix.txt --- unix.txt : Link Count = 2 unix.txt : Inode = 192 2. stat : unix.sym --- unix.sym : Link Count = 2 unix.sym : Inode = 192 3. lstat : unix.sym --- unix.sym : Link Count = 1 unix.sym : Inode = 202

[예제 3-11] readlink 함수 사용하기 (test9.c) ex3_11.c 01 #include <sys/stat.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 char buf[BUFSIZ]; 08 int n; 09 10 n = readlink("unix.sym", buf, BUFSIZ); 11 if (n == -1) { 12 perror("readlink"); 13 exit(1); 14 } 15 16 buf[n] = '\0'; 17 printf("unix.sym : READLINK = %s\n", buf); 18 19 return 0; 20 } # ex3_11.out unix.sym : READLINK = unix.txt # ls -l unix.sym lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym ->unix.txt

[예제 3-12] realpath 함수 사용하기 01 #include <sys/stat.h> ex3_12.c 01 #include <sys/stat.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 char buf[BUFSIZ]; 07 08 realpath("unix.sym", buf); 09 printf("unix.sym : REALPATH = %s\n", buf); 10 11 return 0; 12 } # ex3_12.out unix.sym : REALPATH = /export/home/jw/syspro/ch3/unix.txt

실습(p166) 연습문제 1 연습문제 2 연습문제 3