UNIX의 파일은 일련의 바이트로 이루어져 있으며 정보를 담는다.
지난주에 설명한 커널(Kernel)은 파일의 내용이 무엇인지 굳이 신경 쓰지 않는다. 일반 파일이든 장치 파일이든, 대부분은 바이트 스트림으로 다루고 필요한 작업은 시스템 호출(System Call)을 통해 요청한다.
많은 프로그램은 커널이 제공하는 시스템 호출을 사용해 파일을 열고, 읽고, 쓰고, 파일 안에서의 위치를 이동한다.
이번 주에는 파일과 관련된 시스템 호출에서 자주 등장하는 인자들을 간략히 정리하려고 한다.
파일 시스템 호출에서 자주 쓰는 인자
count
읽거나 쓸 바이트 수를 나타낸다. 예를 들어 read에서는 버퍼로 읽어 올 최대 바이트 수를 의미하고, write에서는 버퍼에서 파일로 보낼 바이트 수를 의미한다.
buf
프로세스 주소 공간에 있는 버퍼의 주소를 지정한다. read에서는 파일에서 읽은 데이터가 이 버퍼에 저장되고, write에서는 이 버퍼에 들어 있는 데이터가 파일로 전송된다.
fd
열려 있는 파일의 파일 디스크립터(file descriptor)를 가리킨다. 파일 디스크립터는 프로세스가 열린 파일을 식별하기 위해 사용하는 작은 정수 값이다.
flag
파일을 어떤 방식으로 열 것인지 지정한다.
읽기, 쓰기, 읽기/쓰기, 추가(append) 등의 모드를 선택하며, 파일이 존재하지 않을 경우 새로 생성할 것인지도 함께 결정할 수 있다.
mode
새 파일을 만들 때 적용할 파일 권한을 지정한다. 이미 존재하는 파일을 단순히 여는 경우에는 의미가 없을 수 있다.
offset
파일 포인터의 새로운 위치를 계산하는 데 사용할 값, 즉 양수나 음수가 포함된 정수 값을 지정한다.
path
열고자 하는 파일의 경로명이다. 절대 경로 또는 상대 경로를 사용할 수 있다.
where
어떤 기준에 offset 값을 더해 새로운 위치를 계산할 것인지 지정한다.
이 값에 따라 기준은 파일의 시작 위치, 현재 파일 포인터 위치, 파일의 끝 위치가 된다. 따라서 같은 offset이라도 where 값에 따라 전혀 다른 위치를 가리킬 수 있다.
간단한 예시
예를 들어 프로그램이 파일을 열면 커널은 해당 파일을 가리키는 파일 디스크립터를 돌려준다. 이후 프로그램은 이 파일 디스크립터와 버퍼 주소, 바이트 수를 함께 넘겨 read나 write를 호출한다. 파일의 특정 위치로 이동해야 할 때는 offset과 where를 사용해 파일 포인터를 조정한다.
정리하면 path와 flag, mode는 주로 파일을 여는 과정에서 중요하고, fd, buf, count는 읽기와 쓰기에서 자주 사용된다. offset과 where는 파일 안의 위치를 이동할 때 핵심적인 역할을 한다.