40
Linux/UNIX Programming APUE (File I/O) 문문문 문문문문문 IT 문문 문문문문문문문

Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교 IT 대학 컴퓨터과학전공

  • Upload
    garran

  • View
    82

  • Download
    0

Embed Size (px)

DESCRIPTION

Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교 IT 대학 컴퓨터과학전공. 강의 목표 및 내용. APUE (File I/O). 강의 목표 파일의 특성을 이해한다 . 파일을 열고 닫는다 . 파일로부터 데이터를 읽고 쓴다 . 기타 파일 제어 함수를 익힌다 . 강의 내용 파일 구조 (UNIX 파일은 어떤 구조일까 ?) 파일 관련 시스템 호출 시스템 호출의 효율과 구조. What is a File?. APUE (File I/O). - PowerPoint PPT Presentation

Citation preview

Page 1: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

Linux/UNIX Programming

APUE (File I/O)

문양세강원대학교 IT 대학 컴퓨터과학전공

Page 2: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 2

강의 목표 및 내용

강의 목표

• 파일의 특성을 이해한다 . • 파일을 열고 닫는다 . • 파일로부터 데이터를 읽고 쓴다 . • 기타 파일 제어 함수를 익힌다 .

강의 내용

• 파일 구조 (UNIX 파일은 어떤 구조일까 ?)• 파일 관련 시스템 호출

• 시스템 호출의 효율과 구조

APUE (File I/O)

Page 3: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 3

What is a File?

A file is a contiguous sequence of bytes.(UNIX 에서 파일은 연속적인 바이트 시퀀스로 볼 수 있다 .)

No format imposed by the operating system.(UNIX 운영체제는 파일에 특별한 Format 을 부여치 않는다 .)

Each byte is individually addressable in a disk file.( 파일의 각 바이트는 고유의 주소를 가지고 ( 매길 수 ) 있다 .)

APUE (File I/O)

Page 4: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 4

File Descriptor (1/2)

open() returns an fd, an integer value.

Used in subsequent I/O operations on that file.(Open 된 파일의 fd 는 이후 File I/O 연산에 사용된다 .)

close(fd) closes that file described by fd.

All of a process's open files are automatically closed when it terminates.( 프로세스가 종료되면 , 해당 프로세스가 Open 한 파일은 자동적으로 Close 된다 .)

APUE (File I/O)

Page 5: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 5

File Descriptor (2/2)

file descriptor: 0 ~ N (N = 19? or more) // unistd.h

APUE (File I/O)

Value Meaning0 standard input1 standard output2 standard error

3 .. 19 fds for users

Page 6: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 6

APUE (File I/O)파일을 위한 Kernel 자료 구조 – skip

process table en-try

file descriptorsfd 0:fd 1:fd 2:fd 3:

. . . .

fd flags ptr

open file tablefd status flagscurrent file offsetv-node ptr

fd status flagscurrent file offsetv-node ptr

v-node tablev-node

informationi-node

informationcurrent file size

v-nodeinformation

i-nodeinformation

current file size

The meaning of each field will be explained in next slides.

Page 7: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 7

Process Table Entry – skip

프로세스 테이블 (Process Table)• 커널 (kernel) 자료구조

• 프로세스 목록

• 프로세스 프로세스 테이블 항목

프로세스 테이블 항목 (Process Table Entry)• 파일 구분자 (file descriptor) 의 배열을 포함

APUE (File I/O)

Page 8: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 8

Open File Table – skip

파일 테이블 (File Table)• 커널 자료구조

• 열려진 모든 파일 목록

• 열려진 파일 파일 테이블의 항목

파일 테이블 항목 (File Table Entry)• 파일 상태 플래그 (read, write, append, sync, nonblocking,…) open() 시 주는 정보

• 파일의 현재 위치 (current file offset)• v-node 에 대한 포인터

APUE (File I/O)

Page 9: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 9

v-node – skip

v-node 의 내부

• 파일의 유형 ( 일반 , 디렉토리 , 특수 파일 , …)• 함수들에 대한 포인터 배열 : 이 파일을 다루는데 사용되는 함수들

• i-node− 하드 디스크에 저장되어 있는 자료구조

− 파일에 대한 ( 실질적인 ) 정보를 가지고 있음

◦ 소유자 , 크기

◦ 파일이 위치한 장치 ( 실제 가장 중요한 정보에 해당함 )◦ 파일 내용 디스크 블럭에 대한 포인터 ( 실제 가장 중요한 정보에 해당함 )

APUE (File I/O)

Page 10: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 10

파일 관련 System Calls

open() – 열기

creat() - 파일 생성

close() – 닫기

read() – 읽기

write() – 쓰기

lseek() - 이동

APUE (File I/O)

Page 11: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 11

open() – 파일 열기

파일을 연다 .파일이 없으면 경우에 따라 새로 만들어 질 수도 있다 .• pathname : 파일의 이름

• mode : 파일의 access permission 값으로 , 생략가능 새로운 파일을 만드는 경우에만 사용됨 (creat() 함수 설명 참조 )

• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int open (const char *pathname, int oflag, [ mode_t mode ]);

Page 12: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 12

open() 의 파라미터 (1/2)

두 번째 파라미터 oflag 는 다음 상수들의 (logical) OR 이다 .• 예

int fd;fd = open("afile", O_RDWR | O_CREAT, 0644);

열기 모드에 대해서 , 반드시 하나를 지정해 주어야 한다 .• O_RDONLY : 읽기 모드 , write 함수를 사용 할 수 없음

• O_WRONLY : 쓰기 모드 , read 함수를 사용 할 수 없음

• O_RDWR : 읽고 쓰기 모드 , read 및 write 사용 가능

APUE (File I/O)

Page 13: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 13

open() 의 파라미터 (2/2)

선택적 지정 가능 플래그

• O_APPEND : 모든 write 된 데이터는 파일의 끝에 추가된다 .• O_CREAT : 파일이 없을 경우 파일을 생성한다 ( 이 경우 , 세 번째 인자 mode

가 사용 ).• O_EXCL : 그 이름의 파일이 이미 있고 O_CREAT 를 지정한 경우 에러를

발생시킨다 .• O_TRUNC : 파일이 있는 경우에 기존 내용을 지우고 , 파일 크기를 0 으로

만든다 .• O_SYNC : 각 write 함수 호출은 디스크에 물리적으로 쓰여진 후 리턴한다

APUE (File I/O)

Page 14: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 14

예제 : open.cAPUE (File I/O)

Page 15: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 15

creat() – 파일 생성

새로운 파일을 생성한다 .• pathname : 파일의 이름

• mode : 파일의 access permission 값

• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int creat ( const char *pathname, mode_t mode );

Page 16: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 16

creat() 의 파라미터

다음 두 함수의 호출은 동일한 기능을 수행함

• fd = creat ( pathname, mode ); • fd = open ( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

두 번째 파라미터인 mode 는 permission mode 를 나타냄

• 0644 -rw-r--r--• 0755 -rwxr-xr-x• 0444 -r--r--r--

APUE (File I/O)

Page 17: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 17

close() – 파일 닫기

작업이 끝난 후 파일을 닫는다 .파일을 닫지 않더라도 프로세스가 종료하면 , 모든 열려진 파일들은 자동적으로 닫힌다 .• filedesc : 닫고자 하는 파일의 파일 식별자 (File Descriptor)• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int close ( int filedesc );

Page 18: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 18

read() – 파일 읽기 (1/2)

파일에서 데이터를 읽는다 .buf: 읽은 데이터를 저장할 메모리 ( 버퍼 )nbytes: 읽을 데이터의 바이트 수

리턴 값

• 성공하면 읽은 바이트 수 (nbytes 와 다를 수 ( 작을 수 ) 있음 )• 파일의 끝을 만나면 0• 실패하면 -1

APUE (File I/O)

#include <unistd.h>ssize_t read ( int filedes, void *buf, size_t nbytes );

Page 19: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 19

read() – 파일 읽기 (2/2)

읽을 데이터가 충분하면 한 번에 nbytes 만큼 읽는다 .읽을 데이터가 nbytes 보다 적은 경우 더 적게 읽기도 한다 .• 파일의 끝에 다다른 경우

• 네트웍 입출력을 수행하는 경우

참고

• size_t : unsigned integer• ssize_t : signed integer

APUE (File I/O)

Page 20: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 20

예제 : count.c ( 문자 수 세는 프로그램 ) (1/2)APUE (File I/O)

Page 21: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 21

예제 : count.c ( 문자 수 세는 프로그램 ) (2/2)APUE (File I/O)

Page 22: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 22

write() – 파일 쓰기

파일에 데이터를 쓴다 .buf: 쓸 데이터를 저장한 메모리 ( 버퍼 )nbytes: 쓸 데이터의 바이트 수

리턴 값

• 성공하면 , 파일에 쓰여진 데이터의 바이트 수 (nbytes 보다 작을 수 있음 )• 실패하면 -1

APUE (File I/O)

#include <unistd.h>ssize_t write (int filedes, const void *buf, size_t nbytes);

Page 23: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 23

lseek() – 오프셋 ( 커서 ) 이동 (1/2)

파일의 현재 위치 (current file offset) 를 이동한다 .파라미터 설명• whence: ( 이동을 시작할 ) 위치의 기준점

− SEEK_SET : 파일의 시작점을 기준으로 이동

− SEEK_CUR : 현재 위치를 기준으로 이동

− SEEK_END : 파일의 끝을 기준으로 이동

• offset: 기준점에서의 상대적인 거리 (byte 단위 )• SEEK_CUR, SEEK_END 와 같이 쓰일 때는 음수도 가능

리턴 값 : 성공하면 이동한 현재 위치를 리턴 , 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <unistd.h>off_t lseek (int filedes, off_t offset, int whence );

Page 24: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 24

lseek() – 오프셋 ( 커서 ) 이동 (2/2)

파일의 현재 위치 ( 오프셋 ) 를 임의의 위치로 이동한다

파일의 현재 위치 (current file offset)• 파일에 대한 읽기 / 쓰기는 파일의 현재 위치에서 실행된다 .• 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다 .• 읽기 / 쓰기 후 파일의 현재 위치는 읽기 / 쓰기 한 byte 수 만큼 저절로 뒤로 이동된다 .• lseek() 를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다

APUE (File I/O)

Page 25: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 25

예제 : lseek1.c (1/3)APUE (File I/O)

Page 26: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 26

예제 : lseek1.c (2/3)APUE (File I/O)

lseek1.c 의 출력 파일 “ file.hole” 의 내용

UNIX 명령어인 od (octal dump) 를 사용하여 확인할 수 있음

0 1 2 3 4 5 6 7 8 90 a b c d e f g h i j

10 \0 \0 \0 \0 \0 \0 \0 \0 \0 \020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \030 \0 \0 \0 \0 \0 \0 \0 \0 \0 \040 A B C D E F G H I J

Page 27: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 27

예제 : lseek1.c (3/3)APUE (File I/O)

Page 28: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 28

fcntl() – 파일 제어APUE (File I/O)

역할 : 파일의 속성을 알아내거나 변경한다 .cmd: F_GETFL, F_SETFL, F_GETFD, F_SETFD, F_DUPFD, …리턴 값

• 성공인 경우 : 파라미터인 cmd 에 따라 다름

• 실패인 경우 : -1

#include <sys/types.h>#include <fcntl.h>#include <unistd.h>int fcntl (int filedes, int cmd, … /* int arg */ );

Page 29: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 29

fcntl() 의 주요 사용법APUE (File I/O)

F_GETFL : file table 의 file status flags 를 리턴

F_SETFL : file status flags 를 설정

File status flag DescriptionO_RDONLYO_WRONLYO_RDWR

open for reading onlyopen for writing onlyopen for reading and writing

O_APPENDO_NONBLOCKO_SYNCO_ASYNC

append on each writenonblocking modewait for writes to completeasynchoronouse I/O

Page 30: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 30

예제 : fileflags.c (1/2)APUE (File I/O)

Page 31: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 31

예제 : fileflags.c (2/2)APUE (File I/O)

Page 32: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 32

Asynchronous Write

UNIX 에서의 Write 는 Asynchronous Write 이다 .• 데이터가 디스크에 쓰여지길 기다리지 않고 ,• 쓰여질 데이터를 큐 (queue) 에 등록하고 바로 리턴한다 .• 큐에 등록된 데이터는 나중에 (Scheduling 에 의해 한꺼번에 ) 디스크에 쓰여진다

Synchronous Write• Write 호출은 데이터가 실제로 디스크에 쓰여진 후 리턴한다 .• Asynchronous Write 에 비해서 Clock Time 이 증가한다 .• File Table 의 File Status Flags 에서 O_SYNC 플래그를 설정한다 .

APUE (File I/O)

Page 33: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 33

예제 : write2.c (1/3)APUE (File I/O)

Page 34: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 34

예제 : write2.c (2/3)APUE (File I/O)

Page 35: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 35

예제 : write2.c (3/3)APUE (File I/O)

Page 36: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 36

실험 결과

상기 결과에서 볼 수 있듯이 Synchronous Write 가 훨씬 더 느림

DBMS(Database Management System) 처럼 실제로 데이터가 디스크에 기록되었는지 여부가 중요한 경우에 사용됨

APUE (File I/O)

BUFFSIZE User CPU (seconds)

System CPU(seconds)

Clock time(seconds) #loops

asynchrohous 8,192 0.0 1.1 3.6 12,800 synchrohous 8,192 0.0 3.4 180.3 12,800

Page 37: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 37

에러 처리APUE (File I/O)

파라미터 errno 값에 해당하는 에러 메시지를 리턴한다 .

표준 에러에 다음과 같은 순서로 메시지를 출력한다 .• msg 출력

• 문자열 ": " 출력

• 시스템 전역 변수 (system global variable) errno 값에 해당하는 에러 메시지 출력

#include <stdio.h>

void perror(const char *msg);

Page 38: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 38

write_num.c / read_num.c (1/3) APUE (File I/O)

Page 39: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 39

write_num.c / read_num.c (2/3) APUE (File I/O)

Page 40: Linux/UNIX Programming APUE (File I/O ) 문양세 강원대학교  IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 40

write_num.c / read_num.c (3/3) APUE (File I/O)