<4D F736F F F696E74202D FC6C4C0CFB0FA20B5F0B7BAC5E4B8AE205BC8A3C8AF20B8F0B5E55D>

Similar documents
PowerPoint 프레젠테이션

Microsoft PowerPoint - 09_FileSystem

Microsoft PowerPoint - chap3 [호환 모드]

제1장 Unix란 무엇인가?

Microsoft PowerPoint APUE(Files and Directories).ppt

Discrete Mathematics

슬라이드 1

[ 컴퓨터시스템 ] 3 주차 1 차시. 디렉토리사이의이동 3 주차 1 차시디렉토리사이의이동 학습목표 1. pwd 명령을사용하여현재디렉토리를확인할수있다. 2. cd 명령을사용하여다른디렉토리로이동할수있다. 3. ls 명령을사용하여디렉토리내의파일목록을옵션에따라다양하게확인할수

Microsoft PowerPoint - ch09_파이프 [호환 모드]

2009년 상반기 사업계획

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

chap7.key

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

로봇SW교육원 강의자료

PowerPoint 프레젠테이션

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다고가정하자. / /bin/ /home/ /home/taesoo/ /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자가터미널에서다음 ls 명령입력시화면출력

제1장 Unix란 무엇인가?

10.

2009년 상반기 사업계획

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

K&R2 Reference Manual 번역본

제12장 파일 입출력

PowerPoint 프레젠테이션

2009년 상반기 사업계획

PowerPoint 프레젠테이션

Chapter 05. 파일접근권한관리하기

11장 포인터

제1장 Unix란 무엇인가?

Microsoft PowerPoint - lab14.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

untitled


PowerPoint 프레젠테이션

2009년 상반기 사업계획

/chroot/lib/ /chroot/etc/

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

歯9장.PDF

Microsoft PowerPoint - chap11-포인터의활용.pptx

chap 5: Trees

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint APUE(File InO)

벤처연구사업(전동휠체어) 평가

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

Adobe Flash 취약점 분석 (CVE )

Microsoft PowerPoint APUE(File InO).ppt

<4D F736F F F696E74202D FC7C1B7CEBCBCBDBA20BBFDBCBAB0FA20BDC7C7E0205BC8A3C8AF20B8F0B5E55D>

2009년 상반기 사업계획

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다. / /bin/ /home/ /home/taesoo/ /home/taesoo/downloads /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자 (t

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Chapter #01 Subject

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

PowerPoint 프레젠테이션

untitled

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

교육지원 IT시스템 선진화


OCW_C언어 기초

PowerPoint 프레젠테이션

2009년 상반기 사업계획

Microsoft PowerPoint - u3.ppt [호환 모드]

Microsoft PowerPoint - Chapter_04.pptx

Microsoft PowerPoint APUE(File InO).pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

컴파일러

Microsoft PowerPoint - chap12-고급기능.pptx

<4D F736F F F696E74202D FC6C4C0CF20C0D4C3E2B7C2205BC8A3C8AF20B8F0B5E55D>

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

Microsoft PowerPoint - 10-EmbedSW-11-모듈

KEY 디바이스 드라이버

Microsoft PowerPoint - [2009] 02.pptx

슬라이드 1

ABC 11장

PowerPoint 프레젠테이션

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

C 프로그래밊 개요

Microsoft PowerPoint - chap04-연산자.pptx

UI TASK & KEY EVENT

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

OCW_C언어 기초

본 강의에 들어가기 전

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - chap2

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_09.pptx

03장.스택.key

윤성우의 열혈 TCP/IP 소켓 프로그래밍

PowerPoint 프레젠테이션

Chapter 4. LISTS

Transcription:

학습목표 유닉스파일의특징을이해한다. 파일에관한정보를검색하는함수를사용할수있다. 하드링크와심볼릭링크파일을이해하고관련함수를사용할수있다. 파일사용권한을검색하고조정하는함수를사용할수있다. 디렉토리의특징을이해한다. 디렉토리의내용을검색하는함수를사용할수있다. 디렉토리를생성하고삭제하는함수를사용할수있다. 파일과디렉토리 IT CookBook, 유닉스시스템프로그래밍 2/45 목차 유닉스파일의특징 파일정보검색 파일의종류및접근권한검색 하드링크및심볼릭링크생성 디렉토리관련함수 유닉스파일의특징 [1] 파일 유닉스에서파일은데이터저장, 장치구동, 프로세스간통신등에사용 파일의종류 일반파일, 디렉토리, 특수파일 일반파일 텍스트파일, 실행파일, 라이브러리, 이미지등유닉스에서사용하는대부분의파일 편집기나다른응용프로그램을통해생성 3/45 장치파일 장치를사용하기위한특수파일 블록장치파일 : 블록단위 (8KB) 로읽고쓴다. 문자장치파일 : 섹터단위 (512 바이트 ) 로읽고쓴다 -> 로우디바이스 (Raw Device) 예 : /devices 디렉토리 디렉토리도파일로취급 디렉토리와관련된데이터블록은해당디렉토리에속한파일의목록과 inode 저장 4/45

유닉스파일의특징 [1] 유닉스파일의특징 [2] 파일의종류구분 ls l 명령으로파일의종류확인가능 : 결과의맨앞글자로구분 # ls l /usr/bin/vi r xr xr x 5 root bin 193968 20 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 5/45 6/45 유닉스파일의특징 [3] 파일정보검색 [1] 파일의구성요소 파일명, inode, 데이터블록 파일명 사용자가파일에접근할때사용 파일명과관련된 inode 가반드시있어야함 파일명은최대 255 자까지가능 파일명에서대소문자를구분하며,. 으로시작하면숨김파일 inode 외부적으로는번호로표시하며내부적으로는두부분으로나누어정보저장 파일정보를저장하는부분 데이터블록의주소저장하는부분 파일의 inode 번호는 ls i 명령으로확인가능 데이터블록 실제로데이터가저장되는부분 7/45 파일명으로파일정보검색 : stat(2) #include <fcntl.h> #include <sys/stat.h> int stat(const char *restrict path, struct stat *buf); inode에저장된파일정보검색 path에검색할파일의경로를지정하고, 검색한정보를 buf에저장 stat 구조체 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]; }; 8/45

[ 예제 3-1] 파일명으로 inode 정보검색하기 ex3_1.c 01 06 struct stat buf; 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 9/45 파일정보검색 [2] 파일기술자로파일정보검색 : fstat(2) #include <sys/stat.h> int fstat(int fd, struct stat *buf); fd 로지정한파일의정보를검색하여 buf 에저장 [ 예제 3-2] 명령행인자출력하기 ex3_2.c 01 06 struct stat buf; 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); 10/45 [ 예제 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 값의구조 11/45 12/45

파일종류검색 [1] 상수를이용한파일종류검색 파일의종류검색관련상수 st_mode 값과상수값을 AND(&) 연산하면파일의종류부분만남게된다. [ 예제 3-3] 상수를이용해파일종류검색하기 ex3_3.c 01 06 struct stat buf; 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; 13/45 14/45 [ 예제 3-3] 상수를이용해파일종류검색하기 23 case S_IFREG: 24 printf("unix.txt : Regular File\n"); 25 break; 26 } 27 28 return 0; 29 } 파일종류검색 [2] 매크로를이용한파일종류검색 # ex3_3.out Mode = 100644 (16 진수 : 81a4) Kind = 8000 unix.txt : Regular File 각매크로는인자로받은 mode 값을 0xF000 과 AND 연산수행 AND 연산의결과를파일의종류별로정해진값과비교하여파일의종류판단 이매크로는 POSIX 표준 15/45 16/45

[ 예제 3-4] 매크로를이용해파일종류검색하기 ex3_4.c 01 06 struct stat buf; 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) 17/45 18/45 파일접근권한검색 [2] [ 예제 3-5] 상수를이용해파일접근권한검색하기 ex3_5.c POSIX 에서정의한접근권한검색관련상수 시프트연산없이직접 AND 연산이가능한상수정의 01 # 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 06 struct stat buf; 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 } 19/45 20/45

파일접근권한검색 [3] 함수를사용한파일접근권한검색 : access(2) int access(const char *path, int amode); path 에지정된파일이 amode 로지정한권한을가졌는지확인하고리턴 접근권한이있으면 0 을, 오류가있으면 -1 을리턴 오류메시지 ENOENT : 파일이없음 EACCESS : 접근권한이없음 amode 값 R_OK : 읽기권한확인 W_OK : 쓰기권한확인 X_OK : 실행권한확인 F_OK : 파일이존재하는지확인 [ 예제 3-6] access 함수를이용해접근권한검색하기 ex3_6.c 01 #include <sys/errno.h> 02 05 extern int errno; 06 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. 21/45 22/45 파일접근권한변경 [ 예제 3-7] chmod 함수사용하기 ex3_7.c 파일명으로접근권한변경 : chmod(2) #include <sys/stat.h> int chmod(const char *path, mode_t mode); 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/stat.h> int fchmod(int fd, mode_t mode); mode 값설정후 chmod(path, mode) 잊지말기! 23/45 01 06 struct stat buf; 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 = 1054 2.Mode = 1070 # ls l unix.txt rwxrwx 1 root other 24 1월 8일 15:47 unix.txt 24/45

링크파일생성 [1] [ 예제 3-8] link 함수사용하기 ex3_8.c 링크 이미있는파일이나디렉토리에접근할수있는새로운이름 같은파일 / 디렉토리지만여러이름으로접근할수있게한다 하드링크 : 기존파일과동일한 inode 사용, inode 에저장된링크개수증가 심볼릭링크 : 기존파일에접근하는다른파일생성 ( 다른 inode 사용 ) 하드링크생성 : link(2) int link(const char *existing, const char *new); 두경로는같은파일시스템에존재해야함 25/45 01 03 #include <stdio.h> 05 06 int main(void) { 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 # 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 26/45 링크파일생성 [2] 심볼릭링크정보검색 심볼릭링크생성 : symlink(2) int symlink(const char *name1, const char *name2); [ 예제 3-9] symlink 함수사용하기 ex3_9.c 01 03 06 symlink("unix.txt", "unix.sym"); 08 return 0; 09 } 심볼릭링크정보검색 : lstat(2) #include <sys/stat.h> int lstat(const char *path, struct stat *buf); lstat : 심볼릭링크자체의파일정보검색 심볼릭링크를 stat 함수로검색하면원본파일에대한정보가검색된다. 심볼릭링크의내용읽기 : readlink(2) ssize_t readlink(const char *restrict path, char size_t bufsiz); 심볼릭링크의데이터블록에저장된내용읽기 *restrict buf, # 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 # ls l unix* rwxrwx 2 root other 24 1월 8일 15:47 unix.ln lrwxrwxrwx 1 root other 8 1월 11일 18:48 unix.sym > unix.txt rwxrwx 2 root other 24 1월 8일 15:47 unix.txt 27/45 원본파일의경로읽기 : realpath(3) #include <stdlib.h> char *realpath(const char *restrict file_name, char *restrict resolved_name); 심볼릭링크가가리키는원본파일의실제경로명출력 28/45

[ 예제 3-10] lstat 함수사용하기 ex3_10.c 01 03 #include <stdio.h> 05 06 int main(void) { 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 29/45 30/45 [ 예제 3-11] readlink 함수사용하기 ex3_11.c [ 예제 3-12] realpath 함수사용하기 ex3_12.c 01 #include <sys/stat.h> 02 03 #include <stdlib.h> #include <stdio.h> 05 06 int main(void) { 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 } 01 #include <sys/stat.h> 02 #include <stdlib.h> 06 char buf[bufsiz]; 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 # 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 31/45 32/45

디렉토리관련함수 [1] [ 예제 3-13] 디렉토리생성 / 삭제 / 이름변경하기 ex3_13.c 디렉토리생성 : mkdir(2) #include <sys/stat.h> int mkdir(const char *path, mode_t mode); path 에지정한디렉토리를 mode 권한에따라생성한다. 디렉토리삭제 : rmdir(2) int rmdir(const char *path); 디렉토리명변경 : rename(2) #include <stdio.h> int rename(const char *old, const char *new); 01 #include <sys/stat.h> 02 03 #include <stdlib.h> #include <stdio.h> 05 06 int main(void) { if (mkdir("han", 55) == 1) { 08 perror("han"); 09 exit(1); 10 } 11 12 if (mkdir("bit", 55) == 1) { 13 perror("bit"); 14 exit(1); 15 } 16 17 if (rename("han", "hanbit") == 1) { 18 perror("hanbit"); 19 exit(1); 20 } 21 han -> hanbit 로변경 33/45 34/45 [ 예제 3-13] 디렉토리생성 / 삭제 / 이름변경하기 디렉토리관련함수 [2] 22 if (rmdir("bit") == 1) { 23 perror("bit"); 24 exit(1); 25 } 26 27 return 0; 28 } bit 는생성했다삭제 현재작업디렉토리위치 : getcwd(3) char *getcwd(char *buf, size_t size); 현재작업디렉토리위치를알려주는명령은 pwd, 함수는 getcwd # ex3_13.out # ls l drwxr xr x 2 root other 512 1월 12일 18:06 hanbit 디렉토리이동 : chdir(2) int chdir(const char *path); 35/45 36/45

[ 예제 3-14] 작업디렉토리위치검색 / 디렉토리이동하기 01 02 #include <stdio.h> 03 int main(void) { 05 char *cwd; 06 char wd[bufsiz]; 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 ex3_14.c 디렉토리정보검색 [1] 디렉토리열기 : opendir(3) #include <dirent.h> DIR *opendir(const char *dirname); 성공하면열린디렉토리를가리키는 DIR 포인터를리턴 디렉토리닫기 : closedir(3) #include <dirent.h> int closedir(dir *dirp); 디렉토리정보읽기 : readdir(3) #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; 37/45 38/45 [ 예제 3-15] 디렉토리열고정보읽기 ex3_15.c [ 예제 3-16] 디렉토리항목의상세정보검색하기 ex3_16.c 01 #include <dirent.h> 02 #include <stdlib.h> 06 DIR *dp; 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 01 03 #include <dirent.h> #include <stdlib.h> 05 #include <stdio.h> 06 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 39/45 40/45

[ 예제 3-16] 디렉토리항목의상세정보검색하기 23 sprintf(path, "hanbit/%s", dent >d_name); 24 stat(path, &sbuf); 디렉토리의항목을읽고 25 다시 stat 함수로상세정보검색 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 } 디렉토리정보검색 [2] 디렉토리오프셋 : telldir(3), seekdir(3), rewinddir(3) #include <dirent.h> long telldir(dir *dirp); void seekdir(dir *dirp, long loc); void rewinddir(dir *dirp); telldir : 디렉토리오프셋의현재위치를알려준다. seekdir : 디렉토리오프셋을 loc 에지정한위치로이동시킨다. rewinddir : 디렉토리오프셋을디렉토의시작인 0 으로이동시킨다. # ls ai hanbit 208. 189.. 213 han.c # ex3_16.out Name : han.c Inode(dirent) : 213 Inode(stat) : 213 Mode : 100644 Uid : 0 41/45 42/45 [ 예제 3-17] 디렉토리오프셋변화확인하기 ex3_17.c [ 예제 3-17] 디렉토리오프셋변화확인하기 01 #include <sys/stat.h> 02 #include <dirent.h> 03 #include <stdlib.h> #include <stdio.h> 05 06 int main(void) { 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)); 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 ** Cur Offset : 24 Read han.c Next Offset : 512 43/45 44/45

IT CookBook, 유닉스시스템프로그래밍