프로그래밍/C

open, read 시스템콜을 이용한 파일 입출력

msh1307 2022. 5. 3. 21:26

유닉스 시스템에선 모든 것이 파일이다. 장치도 파일로 취급된다. 

/dev/had1 같은 하드디스크 상의 파일도 존재한다. 

이렇게 장치도 파일로 인식을 하면, 파일을 다루는 것처럼 장치에 접근할 수 있다.

당연히 파일의 종류도 나뉘어 있다. 예를 들어 d가 디렉토리, c가 장치인 것처럼 말이다.

파일을 다루기 위한 기본적인 흐름은 아래와 같다.

1) 파일을 연다.

2) 파일을 읽거나 쓴다.

3) 파일을 닫는다.

 

기본적으로 프로세스는 유저 모드에서 직접적으로 시스템에 접근할 수 없다. 때문에 시스템 콜을 통해서 운영체제에게 자원을 요청한다. 

키보드 입력이나 메모리 공간을 요청하는 것들은 모두 자원을 요청하는 것의 예시이다. 그리고 이런 작업들은 커널 모드에서 이루어지게 된다. 

아래 사진을 보면 커널이 프로세스들보다 하드웨어에 더 가까이 있는것을 확인할 수 있다.

open 함수를 통해 파일을 열 수 있다.

open 함수는 fcntl.h에 다음과 같이 선언되어 있다.

1
2
int open(const char* pathname, int flags[, mode_t mode]);
 
 
cs

pathname : 열 파일. 상대경로나 절대 경로를 지정할 수 있음.

flags : 어떤 방식으로 열 것인지 결정하기 위해서 사용함.

  • O_RDWR : 읽기 쓰기 둘다 가능.
  • O_RDONLY : 읽기만 가능.
  • O_WRONLY : 쓰기만 가능.
  • O_CREAT : 파일 없으면 생성.

리턴 값은 실패 시 -1, 성공하면 자연수가 나온다. 

이 리턴값을 file descriptor 혹은 파일 지정번호라고 하고 이 값을 통해서 파일을 다룰 것이다.

 

close 함수를 통해 파일을 닫을 수 있다.

close 함수는 fcntl.h에 다음과 같이 선언되어 있다.

1
int close(int fd);
cs

fd : file descriptor

성공하면 0, 실패하면 -1을 리턴한다.

 

read 함수를 통해 파일을 읽어올 수 있다. 

이 함수는 unistd.h에 다음과 같이 선언되어 있다.

1
2
ssize_t read(int fd, void* buf, size_t nbytes);
 
 
cs

fd : file descriptor

buf : 데이터를 저장하기 위한 버퍼

nbytes : 읽어올 데이터 byte 수

성공하면 읽은 byte 만큼, 파일의 끝인 경우 0, 실패하면 -1을 리턴한다.

 

write 함수를 통해 파일에 쓸 수 있다.

read와 마찬가지로 unistd.h에 선언되어있다.

1
2
ssize_t write(int fd, const void* buf, size_t nbytes);
 
 
cs

fd : file descriptor

buf : 쓸 데이터를 저장한 버퍼

nbytes : 쓸 byte 수

성공하면 쓴 byte, 실패하면 -1을 리턴함.

 

 

부득이하게 칼리 리눅스에서 파일을 만들고, 읽고 쓰기를 해보았다.

Desktop에서 README에 내용을 넣어줬다.

인수를 받아서 파일을 입출력하는 프로그램을 짜보았다.

argc는 인수의 개수이고 기본적으로 1 이상이다. argv[0]은 항상 자기 자신을 가리킨다. 

중간에 memset을 해줘서 마지막 49번째 인덱스에 0를 넣어줬다. 왜냐하면 printf는 널문자 전까지 읽어오기 때문이다.

널문자는 아스키코드값이 0이라 memset에서 0x00을 넣어줬다.

strcmp는 두 문자열을 비교해서 같으면 0을 리턴한다. 

 

컴파일했다.

제대로 동작한다. 

마지막에 쓰기를 그냥 갔다 붙이기만 해서 HELLo뒤에 널문자도 같이 적힌 것 같다. 

'프로그래밍 > C' 카테고리의 다른 글

C 배열 포인터 array VS &array 차이, 디버깅을 통한 확인  (0) 2022.05.22
size_t, pid_t,ssize_t...  (0) 2022.05.03
scanf, gets, fgets 차이  (0) 2022.04.01
EOF(End Of File)  (0) 2022.03.31
함수 호출 방식  (0) 2022.03.29