YS's develop story
open(), close(), read(), write() 시스템 콜 함수, File descriptor 와 inode number (시스템 소프트웨어 - 3 ) 본문
open(), close(), read(), write() 시스템 콜 함수, File descriptor 와 inode number (시스템 소프트웨어 - 3 )
Yusang 2020. 11. 13. 07:00오늘은 시스템 콜 함수 몇 개를 정리해 보았습니다 :)
우선 File descriptor가 무엇인지 확인해 봅시다 ~
사용자가 파일을 관리할 때 서로 다른 파일이라는 것을 지정하기 위해서 파일 이름을 사용하곤 하죠.
OS는 서로 다른 파일이라는 것을 inode number이라는 것을 통해서 내부적으로 구분하고 있습니다.
줄여서 id라고 하고 Id는 숫자가 됩니다.
우리가 컴퓨터에 있는 어떤 파일을 읽고 싶다면, OS는 디스크에서 해당하는 파일을 찾고, 파일에 대한 정보를 메모리(dram)로 보내게 됩니다.
그리고 메모리상에서 파일을 아래처럼 객체화시킵니다.
이때 객체의 포인터, 주소를 file descriptor라고 합니다.
시스템 콜 open 함수에 대해서 알아봅시다.
open함수는 파일을 읽거나 쓰기 위해 파일을 open 하는 함수입니다.
또는 파일이 없다면 빈 파일을 생성할 수도 있습니다.
함수가 성공적으로 호출이 된다면 file descriptor값을 반환하게 됩니다.
오류가 발생한다면 -1을 반환하게 됩니다.
첫 번째 인자로는 파일의 이름 또는 경로
두 번째 인자로는 파일을 어떠한 방식으로 open을 할 것 인지 지정하게 됩니다.
아래의 여러 개의 인자 중 어떤 값을 넣느냐에 따라 open 방식이 달라지게 됩니다.
세 번째 인자로는 파일의 접근 권한을 받습니다.
예를 들어 777이라면 사용자, 그룹, 다른 사용자에게 읽기, 쓰기, 수정 권한을 부여하는 것이고
700이라면 사용자에게만 읽기, 쓰기, 수정 권한을 부여하게 됩니다.
파일의 접근권한에 대해서는 아래의 포스트에서 자세한 설명을 볼 수 있습니다.
리눅스 파일 권한 설명, 리눅스 파일 권한 변경 및 확인
파일을 open 했으면 작업을 수행한 뒤에 close를 해주어야 합니다.
close함수는 아래와 같습니다.
성공하면 0을 반환하고 실패하면 -1을 반환합니다.
여기서 다시 설명을 추가하자면 Open 한 파일들을 구분하기 위한 것이 바로 file desciptor입니다.
오픈하지 않은 파일에 대해서는 file desciptor가 존재하지 않습니다. 오픈 하든 오픈하지 않든 파일을 구분하기 위해 id를 사용하고 file descriptor은 오픈한 파일들을 구분하기 위해 사용합니다.
파일을 오픈 한 뒤 파일에 데이터를 작성하려면 시스템 콜 write함수가 필요합니다.
write함수는 아래와 같습니다.
첫 번째 인자 : file descriptor
두 번째 인자 : 파일에 쓸 데이터의 메모리 공간에 대한 포인터
세 번째 인자 : 파일에 쓸 데이터의 크기
파일을 오픈한 뒤 파일의 데이터를 읽는 함수인
read 시스템콜은 아래와 같습니다.
열려 있는 해당 파일에서 데이터를 지정한 크기만큼 읽고 buffer에 저장합니다.
첫 번째 인자 : file descriptor
두 번째 인자 : 파일에서 읽은 데이터를 저장할 메모리 공간
세 번째 인자 : 파일에서 읽을 데이터의 크기
파일을 오픈한 뒤 쓰거나 읽는 작업을 수행하는 read, write시스템 콜에 대한 예시를 아래 포스트에 작성했습니다.