일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 취약점
- 리버싱
- 프로그래밍
- 리눅스 커널
- kernel
- 시스템해킹
- Pwnable.kr
- radare2
- C++
- C언어
- 시스템프로그래밍
- pwn.college
- 시스템 프로그래밍
- 리눅스커널
- pwncollege
- write up
- css
- Bandit
- 리눅스
- 알고리즘
- 커널
- 시스템
- 시그널
- 드론
- px4
- 워게임
- Leviathan
- 컴퓨터구조
- wargame
- 어셈블리어
- Today
- Total
Computer Security
#21 파일 속성 제어 (실습) 본문
목표
file 을 read API 를 통해서 데이터를 읽는데, read 데이터가 없을 경우에, Blocking mode 와 Non-blocking mode가 각각 어떻게 동작하는지와 fcntl API를 이용해서 file의 Blocking mode 와 Non-blocking mode를 변환하는 예제를 작성 해보자.
Blocking mode
1. 기본 뼈대를 만들어 준다.
프로세스가 하나 생성되면 기본적으로 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 명령어를 이용해 컴파일 한 후, 실행 시켜보자.
제일 처음 실행시키면 기다리는 상황이 나온다.
이때, 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> 추가
2. 성공했다면, F_SETFL 를 통해 Non-Block 설정 해주자.
3. 처음 Blocking operation 모드로 동작할때 했던 것 처럼 다시 읽어보자.
4. 전체 코드이다.
5. gcc 명령어를 이용해 컴파일 한 후, 실행 시켜보자.
처음에 Kuri를 적어보니, 처음엔 정상출력 됐는데, Non_blocking 모드로 변경한 부분이 바로 종료 된 것을 알 수 있다.
6. 어떤 에러인지 확인하기 위해 에러 넘버의 값과, 어떤 메세지인지 출력하는 코드를 짜준다.
#include <errno.h>
7. 다시 gcc 컴파일 한 후, 실행 시켜보자.
에러넘버 11: read API가 Non-Blocking 모드로 동작할 때, 읽을 내용이 없을 때 리턴되는 에러다.
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#23 파일 이벤트 (실습) (0) | 2022.09.28 |
---|---|
#22 파일 이벤트 (0) | 2022.09.27 |
#20 파일 속성 제어 (0) | 2022.09.25 |
#19 파일을 이용한 동기화 (실습) (2) | 2022.09.24 |
#18 파일을 이용한 동기화(Race condition) (2) | 2022.09.23 |