Presentation is loading. Please wait.

Presentation is loading. Please wait.

파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용

Similar presentations


Presentation on theme: "파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용"— Presentation transcript:

1 파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
0번 : 표준 입력, 1번 : 표준 출력, 2번 : 표준 오류

2 파일 생성과 열고 닫기[1] 파일 열기: open(2) #include <sys/types.h>
path에 지정한 파일을 oflag에 지정한 플래그 값에 따라 열고 파일기술자를 리턴 oflag 값 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int oflag [, mode_t mode]); 종류 기능 O_RDONLY 파일을 읽기 전용으로 연다. O_WRONLY 파일을 쓰기 전용으로 연다. O_RDWR 파일을 읽기와 쓰기가 가능하게 연다. O_CREAT 파일이 없으면 파일을 생성한다 O_EXCL O_CREAT 옵션과 함께 사용할 경우 기존에 없는 파일이면 파일을 생성하지만, 파일이 이미 있으면 파일을 생성하지 않고 오류 메시지를 출력한다. O_APPEND 파일의 맨 끝에 내용을 추가한다. O_TRUNC 파일을 생성할 때 이미 있는 파일이고 쓰기 옵션으로 열었으면 내용을 모두 지우고 파일의 길이를 0으로 변경한다. O_NONBLOCK/O_NDELAY 비블로킹(Non-blocking) 입출력 O_SYNC/O_DSYNC 저장장치에 쓰기가 끝나야 쓰기 동작을 완료

3 mode=S_IRUSR | S_IWUSR;
파일 생성과 열고 닫기[2] 파일 열기: open(2) mode : 파일 접근권한 지정, 0644같이 숫자나 플래그 값으로 지정 가능 mode=S_IRUSR | S_IWUSR;

4 파일 생성과 열고 닫기[3] 파일 생성 : creat(2) 파일 닫기: close(2)
파일 생성 함수, open 함수에 파일 생성 기능이 없던 구버전 유닉스에서 사용 open 함수와 달리 옵션을 지정하는 부분이 없다. creat 함수로 파일을 생성하면 파일 기술자를 리턴하므로 별도로 open할 필요 없음 파일 닫기: close(2) 프로세스에서 열 수 있는 파일 개수가 제한되어 있으므로 파일의 사용이 끝나면 닫아야 한다. #include <sys/stat.h> #include <fcntl.h> int creat(const char *path, mode_t mode); #include <unistd.h> int close(int fildes);

5 [예제 2-1] 새 파일 열고 닫기 ex2_1.c 01 #include <sys/types.h>
02 #include <sys/stat.h> 03 #include <fcntl.h> 04 #include <unistd.h> 05 #include <stdlib.h> 06 #include <stdio.h> 07 08 int main(void) { int fd; mode_t mode; 11 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 13 fd = open("unix.txt", O_CREAT, mode); if (fd == -1) { perror("Creat"); exit(1); } close(fd); 20 return 0; 22 } # ls unix.txt unix.txt: 해당 파일이나 디렉토리가 없음਺ # gcc -o ex2_1.out ex2_1.c # ex2_1.out# ls -l unix.txt -rw-r--r root other 0 1월 6일 13:10 unix.txt 접근권한:644

6 [예제 2-2] O_EXCL 플래그 사용하기 01 #include <sys/types.h>
02 #include <sys/stat.h> 03 #include <fcntl.h> 04 #include <unistd.h> 05 #include <stdlib.h> 06 #include <stdio.h> 07 08 int main(void) { int fd; 10 fd = open("unix.txt", O_CREAT | O_EXCL, 0644); if (fd == -1) { perror("Excl"); exit(1); } close(fd); 17 return 0; 19 } # ls unix.txt unix.txt # ex2_2.out Excl: File exists # rm unix.txt # ex2_2.out # ls unix.txt unix.txt

7 새로 생성한 파일은 가장 작은 번호인 0번이 할당된다.
[예제 2-3] 파일 기술자 할당 ex2_3.c 01 #include <sys/types.h> 02 #include <sys/stat.h> 03 #include <fcntl.h> 04 #include <unistd.h> 05 #include <stdlib.h> 06 #include <stdio.h> 07 08 int main(void) { int fd; 10 close(0); 12 fd = open("unix.txt", O_RDWR); if (fd == -1) { perror("Excl"); exit(1); } 18 printf("unix.txt : fd = %d\n", fd); close(fd); 21 return 0; 23 } # ex2_3.out unix.txt : fd = 0 11행에서 0번을 닫았으므로 새로 생성한 파일은 가장 작은 번호인 0번이 할당된다.

8 파일 읽기와 쓰기 파일 읽기 : read(2) 파일 쓰기 : write(2) #include <unistd.h>
파일에서 nbytes로 지정한 크기만큼 바이트를 읽어서 buf에 저장 실제로 읽어온 바이트 개수를 리턴 리턴값이 0이면 파일의 끝에 도달했음을 의미 파일의 종류에 상관없이 무조건 바이트 단위로 읽어온다. 파일 쓰기 : write(2) buf가 가리키는 메모리에서 nbytes로 지정한 크기만큼 파일에 기록 실제로 쓰기를 수행한 바이트 수를 리턴 #include <unistd.h> ssize_t read(int fildes, void *buf, size_t nbytes); #include <unistd.h> ssize_t write(int fildes, const void *buf, size_t nbytes);

9 [예제 2-4] 파일 읽기 01 #include <fcntl.h>
[예제 2-4] 파일 읽기 ex2_4.c 01 #include <fcntl.h> 02 #include <unistd.h> 03 #include <stdlib.h> 04 #include <stdio.h> 05 06 int main(void) { 07 int rfd, wfd, n; 08 char buf[10]; 09 10 rfd = open("unix.txt", O_RDONLY); 11 if(rfd == -1) { 12 perror("Open unix.txt"); 13 exit(1); 14 } 15 16 wfd = open("unix.bak", O_CREAT | O_WRONLY | O_TRUNC, 0644); 17 if (wfd == -1) { 18 perror("Open unix.bak"); 19 exit(1); 20 } 21 파일기술자 2개 선언

10 [예제 2-4] 파일 읽기 22 while ((n = read(rfd, buf, 6)) > 0)
[예제 2-4] 파일 읽기 22 while ((n = read(rfd, buf, 6)) > 0) 23 if (write(wfd, buf, n) != n) perror("Write"); 24 25 if (n == -1) perror("Read"); 26 27 close(rfd); 28 close(wfd); 29 30 return 0; 31 } 6바이트씩 읽어온다 # ls unix.bak unix.bak: 해당 파일이나 디렉토리가 없음 # ex2_5.out # cat unix.bak Unix System Programming

11 [예제 2-5] 파일 읽고 쓰기 ... 06 int main(void) { 07 int rfd, wfd, n;
[예제 2-5] 파일 읽고 쓰기 ex2_5.c ... 06 int main(void) { int rfd, wfd, n; char buf[10]; 09 rfd = open("unix.txt", O_RDONLY); if(rfd == -1) { perror("Open unix.txt"); exit(1); } 15 wfd = open("unix.bak", O_CREAT | O_WRONLY | O_TRUNC, 0644); if (wfd == -1) { perror("Open unix.bak"); exit(1); } 21 while ((n = read(rfd, buf, 6)) > 0) if (write(wfd, buf, n) != n) perror("Write"); 24 파일기술자 2개 선언 6바이트씩 읽어온다

12 [예제 2-5] 파일 읽고 쓰기 25 if (n == -1) perror("Read"); 26 27 close(rfd);
[예제 2-5] 파일 읽고 쓰기 if (n == -1) perror("Read"); 26 close(rfd); close(wfd); 29 return 0; 31 } # ls unix.bak unix.bak: 해당 파일이나 디렉토리가 없음਺ # ex2_5.out # cat unix.bak Unix System Programming

13 1024K의 integer를 생성한 후 읽기 및 화면 출력
실습 1024K의 integer를 생성한 후 읽기 및 화면 출력 data size를 반드시 확인 open flag등을 배운 내용대로 실습해 볼 것 예제 2-5를 두 이름대신 file descriptor를 받아들이도록 수정할 것 argc와 argv를 이용하여 command line에서 파일 이름을 받아들이도록 수정할 것


Download ppt "파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용"

Similar presentations


Ads by Google