Unix 프로그램 코드중에
fd = open("data", O_RDONLY);
라는 문장은 뭘 뜻하는것일까?
nread = read(fd, buf, 1024);
라는 문장은 뭘 뜻하는것일까?
한편, open이나 read 호출시 에러가 발생한다면 -1을 반환한다.
또한 여기에서 알 수 있는것은, 파일 접근 프리미티브가 문자 또는 바이트의 단순한 선형 열(linear sequence)만을 다룬다는 것이다.
fd = open("data", O_RDONLY);
라는 문장은 뭘 뜻하는것일까?
현재 작업 디렉토리에서 파일 data를 개방한다.
두번째 인자의 O_RDONLY는 파일을 읽기 전용으로 개방하도록 시스템에 명령한다.
두번째 인자의 O_RDONLY는 파일을 읽기 전용으로 개방하도록 시스템에 명령한다.
nread = read(fd, buf, 1024);
라는 문장은 뭘 뜻하는것일까?
fd(File Descripter)가 갖고 있는 값으로 개방된 파일을 알 수 있다. buf 변수에 최대 1024글자를 읽어서 저장하라는 명령이다.
nread는 ssize_t형 변수로 실제로 읽어들인 문자의 수를 가리킨다.
즉, 파일에 1024 이상의 글자가 있다면 nread는 호출뒤 값이 1024이다.
nread는 ssize_t형 변수로 실제로 읽어들인 문자의 수를 가리킨다.
즉, 파일에 1024 이상의 글자가 있다면 nread는 호출뒤 값이 1024이다.
한편, open이나 read 호출시 에러가 발생한다면 -1을 반환한다.
또한 여기에서 알 수 있는것은, 파일 접근 프리미티브가 문자 또는 바이트의 단순한 선형 열(linear sequence)만을 다룬다는 것이다.
간단하게 파일 접근 프리미티브를 살펴보았는데, 아래에서 각각에 대해 자세히 살펴 보자.
1. open 시스템 호출
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char* pathname, int flags, [mode_t mode]);
첫 번째 인수 pathname은 개방될 파일의 경로이름을 갖고 있는 문자열이다.
다음과 같이, 절대적 경로이름도 될 수 있고 상대적 경로이름도 될 수 있다.
1) /usr/dinobei/test(절대적)
2) dinobei/test(상대적)
3) test(상대적)
3번처럼 pathname을 설정하면, 현재 디렉토리에서의 test파일을 개방하게 된다.
두번째 인수 flag는 fcntl.h 파일안에 #define으로 정의되어있는데(상수)
fcntl.h 파일은 다른 표준 인클루드 파일처럼 /usr/include에 존재한다.
정의된 상수중 흥미로운것을 들자면 다음과 같이 세개가 존재한다.
O_RDONLY 읽기전용으로 개방된 파일
O_WRONLY 쓰기전용으로 개방된 파일
O_RDWR 읽고 쓰기용으로 개방된 파일
에러(예를들어 파일이 없는 경우)가 날 경우에만 -1이 반환되고, 그 외에는 음이 아닌 정수가 할당되는데
프로그래머는 이를 알 필요가 없다.