본문 바로가기

컴퓨터/언어,프로그래밍

운영체제(유닉스)에서 open()과 read()함수의 소스코드

다음은 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 인가를 조사

하는 것이 프로그램 안에서 화일의 끝을 조사하는 보통의 방법이다.

 

 


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...