3 파일과 디렉토리.

Slides:



Advertisements
Similar presentations
1.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
2. 파일 시스템 파일 디렉터리와 경로명 파일 시스템의 구조 새로운 파일 생성 소유권과 허가 파일 유형과 일반화.
6 레이스 컨디션.
Chapter 3 /etc/passwd real uid(진짜 사용자 식별번호), real gid(진짜 그룹 식별번호)
파일 시스템 및 디렉토리 ©숙대 창병모.
제2부 시스템 프로그래밍 파일 및 입출력 2011 가을 숙명여대 창병모 © 숙대 창병모.
9 파이프.
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 개요 가상 디바이스드라이버 실습
Linux System Programming
1 유닉스 시스템 프로그래밍 개요.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
6 프로세스 생성과 실행.
5장 파일 시스템.
6 프로세스 생성과 실행.
조 병 규 Software Quality Lab. 한국교통대학교
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
레이스 컨디션.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
07. 디바이스 드라이버의 초기화와 종료 김진홍
Root Filesystem Porting
Dynamic Memory and Linked List
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()
Root Filesystem Porting
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
8 메모리 매핑.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
4장 파일.
임베디드 실습 # LED, 7’Segment 제어
11장 파일.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
화면 갈무리 및 파일 권한 설정.
setuid, setgid, sticky bit 권한
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Linux/UNIX Programming
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
 파일 아카이브와 압축 명령 익히기.
시스템 인터페이스 Lab1 X-window 및 명령어 사용.
4. 셸을 이용한 명령어 입력. Unix 시스템 쉘 간단한 셸 명령 명령 매개변수(Command arguments)
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
9 파이프.
06. 디바이스의 등록과 해제 김진홍
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
3장 파일 다루기 한빛미디어(주).
시스템 해킹과 보안 permission과 SetUID.
Presentation transcript:

3 파일과 디렉토리

학습목표 유닉스 파일의 특징을 이해한다. 파일에 관한 정보를 검색하는 함수를 사용할 수 있다. 하드 링크와 심볼릭 링크 파일을 이해하고 관련 함수를 사용할 수 있다. 파일 사용권한을 검색하고 조정하는 함수를 사용할 수 있다. 디렉토리의 특징을 이해한다. 디렉토리의 내용을 검색하는 함수를 사용할 수 있다. 디렉토리를 생성하고 삭제하는 함수를 사용할 수 있다.

목차 유닉스 파일의 특징 파일 정보 검색 파일의 종류 및 접근권한 검색 하드링크 및 심볼릭 링크 생성 디렉토리 관련 함수

유닉스 파일의 특징[1] 파일 파일의 종류 일반파일 장치파일 디렉토리 유닉스에서 파일은 데이터 저장, 장치구동, 프로세스 간 통신 등에 사용 파일의 종류 일반파일, 디렉토리, 특수파일 일반파일 텍스트 파일, 실행파일, 라이브러리, 이미지 등 유닉스에서 사용하는 대부분의 파일 편집기나 다른 응용 프로그램을 통해 생성 장치파일 장치를 사용하기 위한 특수 파일 블록장치파일 : 블록단위(8KB)로 읽고 쓴다. 문자장치파일 : 섹터단위(512바이트)로 읽고 쓴다 -> 로우디바이스(Raw Device) 예 : /devices 디렉토리 디렉토리도 파일로 취급 디렉토리와 관련된 데이터 블록은 해당 디렉토리에 속한 파일의 목록과 inode 저장

유닉스 파일의 특징[1]

유닉스 파일의 특징[2] 파일의 종류 구분 ls –l 명령으로 파일의 종류 확인 가능 : 결과의 맨 앞글자로 구분 파일 종류 식별 문자 예제 # ls -l /usr/bin/vi -r-xr-xr-x 5 root bin 193968 2007 9월 14일 /usr/bin/vi # ls -l / lrwxrwxrwx 1 root root 9 7월 16일 15:22 bin -> ./usr/bin drwxr-xr-x 42 root sys 1024 8월 5일 03:26 usr ...... # ls -lL /dev/dsk/c0d0s0 brw-r----- 1 root sys 102, 0 8월 3일 10:59 /dev/dsk/c0d0s0 # ls -lL /dev/rdsk/c0d0s0 crw-r----- 1 root sys 102, 0 8월 3일 12:12 /dev/rdsk/c0d0s0

유닉스 파일의 특징[3] 파일의 구성 요소 파일명 inode 데이터 블록 파일명, inode, 데이터블록 사용자가 파일에 접근할 때 사용 파일명과 관련된 inode가 반드시 있어야 함 파일명은 최대 255자까지 가능 파일명에서 대소문자를 구분하며, ‘.’으로 시작하면 숨김 파일 inode 외부적으로는 번호로 표시하며 내부적으로는 두 부분으로 나누어 정보 저장 파일 정보를 저장하는 부분 데이터 블록의 주소 저장하는 부분 파일의 inode 번호는 ls –i 명령으로 확인 가능 데이터 블록 실제로 데이터가 저장되는 부분

파일 정보 검색[1] 파일명으로 파일 정보 검색 : stat(2) #include <fcntl.h> inode에 저장된 파일 정보 검색 path에 검색할 파일의 경로를 지정하고, 검색한 정보를 buf에 저장 stat 구조체 #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int stat(const char *restrict path, struct stat *buf); struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; blksize_t st_blksize; blkcnt_t st_blocks; char st_fstype[_ST_FSTYPSZ]; };

[예제 3-1] 파일명으로 inode 정보 검색하기 ex3_1.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 10 printf("Inode = %d\n", (int)buf.st_ino); 11 printf("Mode = %o\n", (unsigned int)buf.st_mode); 12 printf("Nlink = %o\n",(unsigned int) buf.st_nlink); 13 printf("UID = %d\n", (int)buf.st_uid); 14 printf("GID = %d\n", (int)buf.st_gid); 15 printf("SIZE = %d\n", (int)buf.st_size); 16 printf("Atime = %d\n", (int)buf.st_atime); 17 printf("Mtime = %d\n", (int)buf.st_mtime); 18 printf("Ctime = %d\n", (int)buf.st_ctime); 19 printf("Blksize = %d\n", (int)buf.st_blksize); 20 printf("Blocks = %d\n", (int)buf.st_blocks); 21 printf("FStype = %s\n", buf.st_fstype); 22 23 return 0; 24 } # ex3_1.out Inode = 192 Mode = 100644 Nlink = 1 UID = 0 GID = 1 SIZE = 24 Atime = 1231397228 Mtime = 1231397228 Ctime = 1231397228 Blksize = 8192 Blocks = 2 FStype = ufs

파일 기술자로 파일 정보 검색 : fstat(2) 파일 정보 검색[2] 파일 기술자로 파일 정보 검색 : fstat(2) fd로 지정한 파일의 정보를 검색하여 buf에 저장 #include <sys/types.h> #include <sys/stat.h> int fstat(int fd, struct stat *buf); 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 10 printf("Inode = %d\n", (int)buf.st_ino); 11 printf("Mode = %o\n", (unsigned int)buf.st_mode); 12 printf("Nlink = %o\n",(unsigned int) buf.st_nlink); 13 printf("UID = %d\n", (int)buf.st_uid); [예제 3-2] 명령행 인자 출력하기 ex3_2.c

[예제 3-2] fstat으로 파일 정보 검색하기 ex3_2.c 14 printf("GID = %d\n", (int)buf.st_gid); 15 printf("SIZE = %d\n", (int)buf.st_size); 16 printf("Atime = %d\n", (int)buf.st_atime); 17 printf("Mtime = %d\n", (int)buf.st_mtime); 18 printf("Ctime = %d\n", (int)buf.st_ctime); 19 printf("Blksize = %d\n", (int)buf.st_blksize); 20 printf("Blocks = %d\n", (int)buf.st_blocks); 21 printf("FStype = %s\n", buf.st_fstype); 22 23 return 0; 24 } # ex3_2.out Inode = 192 UID = 0

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

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

[예제 3-3] 상수를 이용해 파일 종류 검색하기 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] 매크로를 이용해 파일 종류 검색하기 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] 상수를 이용해 파일 접근 권한 검색하기 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 함수를 이용해 접근 권한 검색하기 ex3_6.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 함수 사용하기 01 #include <sys/types.h> 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 함수 사용하기 01 #include <sys/types.h> 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 함수 사용하기 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 함수 사용하기 01 #include <sys/types.h> 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 함수 사용하기 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

디렉토리 관련 함수[1] 디렉토리 생성: mkdir(2) 디렉토리 삭제: rmdir(2) 디렉토리명 변경: rename(2) path에 지정한 디렉토리를 mode 권한에 따라 생성한다. 디렉토리 삭제: rmdir(2) 디렉토리명 변경: rename(2) #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *path, mode_t mode); #include <unistd.h> int rmdir(const char *path); #include <stdio.h> int rename(const char *old, const char *new);

[예제 3-13] 디렉토리 생성/삭제/이름 변경하기 ex3_13.c 01 #include <sys/stat.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 if (mkdir("han", 0755) == -1) { 08 perror("han"); 09 exit(1); 10 } 11 12 if (mkdir("bit", 0755) == -1) { 13 perror("bit"); 14 exit(1); 15 } 16 17 if (rename("han", "hanbit") == -1) { 18 perror("hanbit"); 19 exit(1); } 21 han -> hanbit로 변경

[예제 3-13] 디렉토리 생성/삭제/이름 변경하기 22 if (rmdir("bit") == -1) { 23 perror("bit"); 24 exit(1); 25 } 26 27 return 0; 28 } # ex3_13.out # ls -l drwxr-xr-x 2 root other 512 1월 12일 18:06 hanbit bit는 생성했다 삭제

디렉토리 관련 함수[2] 현재 작업 디렉토리 위치 : getcwd(3) 디렉토리 이동: chdir(2) 현재 작업 디렉토리 위치를 알려주는 명령은 pwd, 함수는 getcwd 디렉토리 이동: chdir(2) #include <unistd.h> char *getcwd(char *buf, size_t size); #include <unistd.h> int chdir(const char *path);

[예제 3-14] 작업 디렉토리 위치 검색/디렉토리 이동하기 ex3_14.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 char *cwd; 06 char wd[BUFSIZ]; 07 08 cwd = getcwd(NULL, BUFSIZ); 09 printf("1.Current Directory : %s\n", cwd); 10 11 chdir("hanbit"); 12 13 getcwd(wd, BUFSIZ); 14 printf("2.Current Directory : %s\n", wd); 15 16 return 0; 17 } # ex3_14.out 1.Current Directory : /export/home/jw/syspro/ch3 2.Current Directory : /export/home/jw/syspro/ch3/hanbit

디렉토리 정보 검색[1] 디렉토리 열기: opendir(3) 디렉토리 닫기: closedir(3) 디렉토리 정보 읽기: readdir(3) 디렉토리의 내용을 한 번에 하나씩 읽어옴 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *dirname); #include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp); #include <sys/types.h> #include <dirent.h> struct dirent *readdir(DIR *dirp); typedef struct dirent { ino_t d_ino; off_t d_off; unsigned short d_reclen; char d_name[1]; } dirent_t;

[예제 3-15] 디렉토리 열고 정보 읽기 01 #include <dirent.h> ex3_15.c 01 #include <dirent.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 DIR *dp; 07 struct dirent *dent; 08 09 if ((dp = opendir("hanbit")) == NULL) { 10 perror("opendir: hanbit"); 11 exit(1); 12 } 13 14 while ((dent = readdir(dp))) { 15 printf("Name : %s ", dent->d_name); 16 printf("Inode : %d\n", (int)dent->d_ino); 17 } 18 19 closedir(dp); 20 21 return 0; 22 } # ex3_15.out Name : . Inode : 208 Name : .. Inode : 189

[예제 3-16] 디렉토리 항목의 상세 정보 검색하기 ex3_16.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <dirent.h> 04 #include <stdlib.h> 05 #include <stdio.h> 06 07 int main(void) { 08 DIR *dp; 09 struct dirent *dent; 10 struct stat sbuf; 11 char path[BUFSIZ]; 12 13 if ((dp = opendir("hanbit")) == NULL) { 14 perror("opendir: hanbit"); 15 exit(1); } 18 while ((dent = readdir(dp))) { 19 if (dent->d_name[0] == '.') continue; 20 else break; 21 } 22

[예제 3-16] 디렉토리 항목의 상세 정보 검색하기 23 sprintf(path, "hanbit/%s", dent->d_name); 24 stat(path, &sbuf); 25 26 printf("Name : %s\n", dent->d_name); 27 printf("Inode(dirent) : %d\n", (int)dent->d_ino); 28 printf("Inode(stat) : %d\n", (int)sbuf.st_ino); 29 printf("Mode : %o\n", (unsigned int)sbuf.st_mode); 30 printf("Uid : %d\n", (int)sbuf.st_uid); 31 32 closedir(dp); 33 34 return 0; 35 } # ls -ai hanbit 208 . 189 .. 213 han.c # ex3_16.out Name : han.c Inode(dirent) : 213 Inode(stat) : 213 Mode : 100644 Uid : 0 디렉토리의 항목을 읽고 다시 stat 함수로 상세 정보 검색

디렉토리 오프셋: telldir(3), seekdir(3), rewinddir(3) 디렉토리 정보 검색[2] 디렉토리 오프셋: telldir(3), seekdir(3), rewinddir(3) telldir : 디렉토리 오프셋의 현재 위치를 알려준다. seekdir : 디렉토리 오프셋을 loc에 지정한 위치로 이동시킨다. rewinddir : 디렉토리 오프셋을 디렉토의 시작인 0으로 이동시킨다. #include <dirent.h> long telldir(DIR *dirp); void seekdir(DIR *dirp, long loc); void rewinddir(DIR *dirp);

[예제 3-17] 디렉토리 오프셋 변화 확인하기 01 #include <sys/stat.h> ex3_17.c 01 #include <sys/stat.h> 02 #include <dirent.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 DIR *dp; 08 struct dirent *dent; 09 10 if ((dp = opendir("hanbit")) == NULL) { 11 perror("opendir"); 12 exit(1); } 15 printf("** Directory content **\n"); 16 printf("Start Offset : %ld\n", telldir(dp)); 17 while ((dent = readdir(dp))) { 18 printf("Read : %s ", dent->d_name); 19 printf("Cur Offset : %ld\n", telldir(dp)); 22 printf("** Directory Pointer Rewind **\n"); 23 rewinddir(dp); 24 printf("Cur Offset : %ld\n", telldir(dp));

[예제 3-17] 디렉토리 오프셋 변화 확인하기 25 26 printf("** Move Directory Pointer **\n"); 27 seekdir(dp, 24); 28 printf("Cur Offset : %ld\n", telldir(dp)); 29 30 dent = readdir(dp); 31 printf("Read %s ", dent->d_name); 32 printf("Next Offset : %ld\n", telldir(dp)); 33 34 closedir(dp); 35 return(0); 36 37 } # ex3_17.out ** Directory content Start Offset : 0 Read : . Cur Offset : 12 Read : .. Cur Offset : 24 Read : han.c Cur Offset : 512 ** Directory Pointer Rewind ** Cur Offset : 0 ** Move Directory Pointer ** Read han.c Next Offset : 512