Computer Security

#21 파일 속성 제어 (실습) 본문

리눅스 시스템 프로그래밍

#21 파일 속성 제어 (실습)

쿠리 Kuri 2022. 9. 26. 18:30
반응형

목표

 

file 을 read API 를 통해서 데이터를 읽는데, read 데이터가 없을 경우에, Blocking mode 와 Non-blocking mode가 각각 어떻게 동작하는지와 fcntl API를 이용해서 file의 Blocking mode 와 Non-blocking mode를 변환하는 예제를 작성 해보자.

 

 

 

 

 

 


Blocking mode


1. 기본 뼈대를 만들어 준다.

main

프로세스가 하나 생성되면 기본적으로 3개의 fd 가 열린다.

 

0번 fd : standard in  (STDIN_FILENO)

 

1번 fd : standard out  (STDOUT_FILENO)

 

2번 fd : standard error  (STDERR_FILENO)

 

 

 

 

 

 


2. 이미 열린상태이기에 open API를 호출할 필요는 없고, STDIN fd의 경우 Blocking operation 모드로 동작한다. read API를 통해 읽어보자.

 

 

1. char buf[128]; 버퍼 선언

 

2. memset(buf, 0, sizeof(buf)); : 버퍼 초기화

 

3. ret = read(STDIN_FILENO, buf, sizeof(buf)); :성공시 읽은byte , 실패시 -1

 

4. printf 를 통해 어떤걸 받아왔는지 출력한다.

 

5. 읽을 데이터가 지금은 없기때문에, 기다리다가 출력하고 종료된다.

 

6. fd를 자동으로 닫아주기 때문에 별도로 닫아줄 필요는 없다.

 

 

 

 

 

 

 


3. gcc 명령어를 이용해 컴파일 한 후, 실행 시켜보자.

gcc 컴파일
./fcntl

제일 처음 실행시키면 기다리는 상황이 나온다.

 

이때, Kuri를 적어보자.

Kuri

Kuri의 뉴 라인까지해서 5바이트를 읽어온 것을 알 수 있다.

 

 

이게 Blocking mode의 동작방식이다.

 

 

 

 

 

 


Non-Blocking mode


과정

 

Blocking mode 실습 코드에서 fcntl API를 이용해서 Non-Blocking 모드로 전환하고 read 를 해보자.

 

총 두번의 fcntl 호출을 해야 한다.(F_GETFL  , F_SETFL)

 

i) 현재상태를 가져오는 fcntl

ii) 설정하는 fcntl

 

 

 

 

 

 


1. 현재상태를 가져오는 fcntl을 적어주고, 예외 처리 해주자.

#include <fcntl.h> 추가

fcntl(STDIN_FILENO, F_GETFL)

 

 

 

 

 


2. 성공했다면, F_SETFL 를 통해  Non-Block 설정 해주자.

 

 

 

 

 


3. 처음 Blocking operation 모드로 동작할때 했던 것 처럼 다시 읽어보자.

 

 

 

 


4. 전체 코드이다.

fcntl.c

 

 

 

 

 


5. gcc 명령어를 이용해 컴파일 한 후, 실행 시켜보자.

./fcntl

처음에 Kuri를 적어보니, 처음엔 정상출력 됐는데, Non_blocking 모드로 변경한 부분이 바로 종료 된 것을 알 수 있다.

 

 

 

 

 

 


6. 어떤 에러인지 확인하기 위해 에러 넘버의 값과, 어떤 메세지인지 출력하는 코드를 짜준다.

#include <errno.h>

error

 

 

 

 

 


7. 다시 gcc 컴파일 한 후, 실행 시켜보자.

./fcntl

에러넘버 11: read API가 Non-Blocking 모드로 동작할 때, 읽을 내용이 없을 때 리턴되는 에러다.

 

반응형
Comments