UNIX System Program-mingPage 2
강의 목표 및 내용
강의 목표
• 파일의 특성을 이해한다 .
• 파일을 열고 닫는다 .
• 파일로부터 데이터를 읽고 쓴다 .
• 기타 파일 제어 함수를 익힌다 .
강의 내용
• 파일 구조 (UNIX 파일은 어떤 구조일까 ?)
• 파일 관련 시스템 호출
• 시스템 호출의 효율과 구조
APUE (File I/O)
UNIX System Program-mingPage 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)
UNIX System Program-mingPage 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)
UNIX System Program-mingPage 5
File Descriptor (2/2)
file descriptor: 0 ~ N (N = 19? or more) // unistd.h
APUE (File I/O)
Value Meaning
0 standard input
1 standard output
2 standard error
3 .. 19 fds for users
UNIX System Program-mingPage 6
파일 관련 System Calls
open() – 열기
creat() - 파일 생성
close() – 닫기
read() – 읽기
write() – 쓰기
lseek() - 이동
APUE (File I/O)
UNIX System Program-mingPage 7
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 ]);
UNIX System Program-mingPage 8
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)
UNIX System Program-mingPage 9
open() 의 파라미터 (2/2)
선택적 지정 가능 플래그
• O_APPEND : 모든 write 된 데이터는 파일의 끝에 추가된다 .
• O_CREAT : 파일이 없을 경우 파일을 생성한다 ( 이 경우 , 세 번째 인자 mode
가 사용 ).
• O_EXCL : 그 이름의 파일이 이미 있고 O_CREAT 를 지정한 경우 에러를 발생시킨다 .
• O_TRUNC : 파일이 있는 경우에 기존 내용을 지우고 , 파일 크기를 0 으로 만든다 .
• O_SYNC : 각 write 함수 호출은 디스크에 물리적으로 쓰여진 후 리턴한다
APUE (File I/O)
UNIX System Program-mingPage 10
예제 : open.cAPUE (File I/O)
UNIX System Program-mingPage 11
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 );
UNIX System Program-mingPage 12
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)
UNIX System Program-mingPage 13
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 );
UNIX System Program-mingPage 14
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 );
UNIX System Program-mingPage 15
read() – 파일 읽기 (2/2)
읽을 데이터가 충분하면 한 번에 nbytes 만큼 읽는다 .
읽을 데이터가 nbytes 보다 적은 경우 더 적게 읽기도 한다 .
• 파일의 끝에 다다른 경우
• 네트워크 입출력을 수행하는 경우
참고
• size_t : unsigned integer
• ssize_t : signed integer
APUE (File I/O)
UNIX System Program-mingPage 16
예제 : count.c ( 문자 수 세는 프로그램 ) (1/2)APUE (File I/O)
UNIX System Program-mingPage 17
예제 : count.c ( 문자 수 세는 프로그램 ) (2/2)APUE (File I/O)
UNIX System Program-mingPage 18
write() – 파일 쓰기
파일에 데이터를 쓴다 .
buf: 쓸 데이터를 저장한 메모리 ( 버퍼 )
nbytes: 쓸 데이터의 바이트 수
리턴 값
• 성공하면 , 파일에 쓰여진 데이터의 바이트 수 (nbytes 보다 작을 수 있음 )
• 실패하면 -1
APUE (File I/O)
#include <unistd.h>
ssize_t write (int filedes, const void *buf, size_t nbytes);
UNIX System Program-mingPage 19
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 );
UNIX System Program-mingPage 20
lseek() – 오프셋 ( 커서 ) 이동 (2/2)
파일의 현재 위치 ( 오프셋 ) 를 임의의 위치로 이동한다
파일의 현재 위치 (current file offset)
• 파일에 대한 읽기 / 쓰기는 파일의 현재 위치에서 실행된다 .
• 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다 .
• 읽기 / 쓰기 후 파일의 현재 위치는 읽기 / 쓰기 한 byte 수 만큼 저절로 뒤로 이동된다 .
• lseek() 를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다
APUE (File I/O)
UNIX System Program-mingPage 21
예제 : lseek1.c (1/3)APUE (File I/O)
UNIX System Program-mingPage 22
예제 : 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 9
0 a b c d e f g h i j
10 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
20 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
30 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
40 A B C D E F G H I J
UNIX System Program-mingPage 23
예제 : lseek1.c (3/3)APUE (File I/O)
UNIX System Program-mingPage 24
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 */ );
UNIX System Program-mingPage 25
fcntl() 의 주요 사용법APUE (File I/O)
F_GETFL : file table 의 file status flags 를 리턴
F_SETFL : file status flags 를 설정
File status flag Description
O_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 completeasynchoronous I/O
UNIX System Program-mingPage 26
예제 : fileflags.c (1/2)APUE (File I/O)
UNIX System Program-mingPage 27
예제 : fileflags.c (2/2)APUE (File I/O)
UNIX System Program-mingPage 28
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)
UNIX System Program-mingPage 29
예제 : write2.c (1/3)APUE (File I/O)
UNIX System Program-mingPage 30
예제 : write2.c (2/3)APUE (File I/O)
UNIX System Program-mingPage 31
예제 : write2.c (3/3)APUE (File I/O)
UNIX System Program-mingPage 32
실험 결과
상기 결과에서 볼 수 있듯이 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
UNIX System Program-mingPage 33
에러 처리APUE (File I/O)
파라미터 errno 값에 해당하는 에러 메시지를 리턴한다 .
표준 에러에 다음과 같은 순서로 메시지를 출력한다 .
• msg 출력
• 문자열 ": " 출력
• 시스템 전역 변수 (system global variable) errno 값에 해당하는 에러 메시지 출력
#include <stdio.h>
void perror(const char *msg);
UNIX System Program-mingPage 34
write_num.c / read_num.c (1/3)
APUE (File I/O)
UNIX System Program-mingPage 35
write_num.c / read_num.c (2/3)
APUE (File I/O)
UNIX System Program-mingPage 36
write_num.c / read_num.c (3/3)
APUE (File I/O)
Top Related