다음은 read 함수의 한 예로서 size file(1) ... fine(n)과 같이 사용하여 각 파일들의 크기를 계산하여 출력하는 프로그램이다.
#include
#include
main(int argc, char *argv[]) {
int fd;
long int size;
int n;
char buf[BUFSIZ];
if (argc == 1) {
fprintf(stderr,"USAGE: %s file(1) file(2) ... file(n)\n",*argv);
return (0);
}
while (--argc > 0) {
if ((fd = open(*++argv, O_RDONLY | O_BINARY)) == -1) {
fprintf(stderr,"Error: Cannot open %s\n",*argv);
continue;
}
size = 0l;
while ((n = read(fd, buf, BUFSIZ)) > 0)
size += n;
if (n == 0)
fprintf(stdout,"%s: %ld bytes.\n",*argv,size);
else
fprintf(stderr,"Error in reading %s\n",*argv);
}
close(fd); /* 핸들이 다루는 파일을 닫는다. 되돌림 값은 파일 닫기가 */
} /* 성공하면 0, 실패하면 -1의 값을 되돌린다 */
결 과
C:\TC>size tc.exe tcc.exe ??
tc.exe: 290249 bytes.
tcc.exe: 179917 bytes.
저수준의 파일 입출력에서 파일로부터 읽어들이는 것은 이 read 밖에 없다. 즉 문자 하나씩밖에 읽어들이지 않기 때문에 만약 정수값을 읽어들이고자 할 때에는 읽어들인 것을 정수로 변환하여야 한다. 따라서 복잡한 포맷으로 된 데이터를 읽어들일 때에는 고수준의 파일 입출력을 사용하는 것이 좋다.
설명
http://unix.co.kr/stories.php?story=02%2F12%2F13%2F9474369
2.1.2. open 시스템 호출
존재하는 화일을 읽거나 쓰기전에 반드시 open 시스템호출로 화일을 개방해
야 한다.
#include
int filedes, flsgs;
char *pathname;
.
.
filedes = open(pathname, flags);
첫번째 인수 pathname은 개방될 화일의 경로이름을 갖고 있는 문자열에 대한
포인터이다. 화일은 open이 호출되기전에 반드시 존재해야 한다. 그렇지 않으
면 오류가 발생한다.
fcntl.h 에서 정의되는 상수
- O_RDONLY 읽기만 허용하는 개방 화일
- O_WRONLY 쓰기만 허용하는 개방 화일
- O_RDWR 읽고 쓰는 것을 허용하는 개방 화일
오류가 발생하면 open은 -1을 돌려준다. 오류는 화일이 존재하지 않을 경우
발생한다. 오류조사(error checking)를 시스템호출을 사용하는 모든 프로그램
에 대해서 해 주는 것은 발생할 지도 모르는 오류를 고려할때 매우 유익하다.
주의사항(caleats)
1. 수행중인 프로그램에 의해 동시에 개방될 수 있는 화일의 수에는 제한이
있다.(보통20) 또한 존재하는 모든 프로세스에 의해 개방될 수 있는 화일
의 수에도 제한이 있다. 이것은 커널안에 있는 표의 크기에 의해 결정된
다.
2. 초기 UNIX에는 인클루드 화일 fcntl.h가 존재하지 않았기 때문에 실제 숫
자가 flags 인수로서 사용되었다.
2.1.5. read 시스템 호출
read 는 화일로부터 임의길이의 문자나 바이트를 호출 프로그램의 제어하에
있는 버퍼로 복사하기 위해 사용된다. 이때 버퍼는 char 의 배열로서 정의된
다.
int nread, filedes, n;
char *bufptr;
.
.
nread = read(filedes, bufptr, n);
read 의 첫번째 인수 filedes 는 앞서 호출한 open 이나 creat 에 의해서 만
들어진 화일 기술어이다. 두번째 인수 bufptr 은 자료가 복사되어질 문자 배열
에 대한 포인터이다. 새번째 인수는 화일로부터 읽어질 바이트의 수를 가지는
양의 정수값이다. read 로부터의 복귀값 nread 는 실제로 읽힌 바이트의 수를
나타낸다. read 의 경우, 시스템은 각 호출 후에 읽혀진 바이트의 수만큼 읽기
-쓰기 포인터를 전진 시킨다. read 호출에 의해 요청된 문자의 수가 화일에 남
아있는 문자의 수보다 클 경우 시스템은 남아있는 문자들만 옮기고, 복귀값을
적적하게 고친다. 이제 이후에 호출되는 read 의 복귀값은 0 이 된다. 즉, 남
아있는 문자가 하나도 없게 된다. 사실, read 로부터 복귀값이 0 인가를 조사
하는 것이 프로그램 안에서 화일의 끝을 조사하는 보통의 방법이다.
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
파일 디스크립터를 출력으로 지정( creat, dup2) (0) | 2009.05.27 |
---|---|
hole있는 파일 생성(creat, write, lseek) (0) | 2009.05.27 |
dup( ), dup2( ) (0) | 2009.05.27 |
Dup2 를 이용한 Redirection 과 원상복귀 (0) | 2009.05.27 |
Socket inheritance with fork/dup2/exec (0) | 2009.05.27 |