일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- px4
- 어셈블리어
- Bandit
- C언어
- radare2
- kernel
- 시스템해킹
- Pwnable.kr
- 리눅스 커널
- pwn.college
- wargame
- write up
- 드론
- 리눅스
- 시스템프로그래밍
- 시스템 프로그래밍
- Leviathan
- 컴퓨터구조
- 알고리즘
- 프로그래밍
- 리눅스커널
- C++
- css
- 취약점
- 시스템
- 시그널
- 리버싱
- 커널
- 워게임
- pwncollege
- Today
- Total
Computer Security
#3 파일 포지션 본문
파일 포지션
파일 내용을 다룰 때, 어떤 Operation을 수행하는 위치. ex) 현재 반짝이는 커서가 어디에 있는지. 파일 오프셋 : 파일의 시작지점부터 현재 커서의 위치까지 얼마나 떨어져 있는지 정수로 보여주는 것이 offset 값이다.
파일 포지션 - 현재 오프셋 가져오기
long ftell (FILE *stream) ;
파라미터
- stream : 열린 파일 포인터
반환 값
- 성공시 파일 포지션(오프셋 값)
- 실패시 -1
파일 포지션 - 오프셋 설정
int fseek(FILE *stream, long offset, int whence);
파라미터
- stream : 열린 파일 포인터
- offset : 오프셋 값(양수/음수 모두 가능)
- whence : 오프셋의 기준
- SEEK_SET : 파일의 시작 기준
- SEEK_END : 파일의 끝 기준
- SEEK_CUR : 현재 파일 포지션의 기준
반환 값
- 성공시 파일 포지션(오프셋 값)
- 실패시 -1
파일 포지션값을 긁어오는 함수 ftell()
long ftell(FILE *stream);
열린 파일포인터를 넣어주면 long타입으로 반환해준다.
실습 1
파일 포지션 값을 읽어서 출력 해보자.
1. vi 명령어를 이용해 file.c 예제 코드를 아래와 같이 작성 해준다.
1. file 포인터를 선언 해준뒤, datafile 로 하고 w 모드로 오픈한다.
2. 파일 포지션값을 긁어오는 함수 ftell() 를 이용해 첫번째줄의 파일 포지션 값을 출력해준다.
3. fputs 명령어를 이용해 한 라인씩 파일을 저장한다.
4. 파일 포지션값을 긁어오는 함수 ftell() 를 이용해 마지막 줄의 파일 포지션 값을 출력해준다.
5. int main 함수에서 동작 해준다.
2. gcc 명령어를 이용해 file 로 컴파일 해준다.
3. ./file 명령어를 이용해 파일 포지션을 확인하고, cat datafile을 이용해 코드도 확인해본다.
실습 2
열려있는 파일에서 read권한으로 파일을 읽어 들여서 파일 포지션 위치를 출력하는 예제를 해보자.
1. read_file 함수를 위의 코드에서 추가해준다.
2. gcc 로 컴파일 해준뒤, ./file 을 이용해 결과값을 출력 해보자.
위에 두줄은 원래 나온 함수이고,
아래 두줄이 read 함수이다.
read 함수 결과값을 살펴보면
처음에 실행 했을때 offset이 0이였으나,
한줄을 읽고 난뒤(fgets), offset이 12임을 알 수 있다.(hello world가 공백포함 12글자 이기 때문에)
실습 3
1. fseek 명령어를 이용해 파일의 끝으로 이동한 후, 추가 해보자.
1. 위의코드에서 read 함수 내용을 수정할텐데, r 이아니라 r+모드로 바꿔주자( r 은 쓰기권한 x)
2. fseek 명령어를 통해 파일포지션을 끝으로 이동 해주자.
3. fseek(fp, 0, SEEK_END); (SEEK_END 는 파일의 끝을 뜻한다.)
2. 결과 값을 확인 해보자.
잘 보면, 4번째 줄에는 offset 이 12임을 알 수 있었는데, fseek 명령어로 파일의 끝으로 옮기니 54가 되는 것을 알 수 있다.
또한, final 이라는 것을 fputs를 통해 넣어준뒤의 offset은 60임을 알 수 있다.(정상적으로 넣어 졌다는 뜻)
3. cat 명령어를 통해 확인해보자.
정상적으로 final이 맨 끝에 입력 된 것을 알 수 있다!
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#6 저수준 파일 열기/닫기, 스트림 포지션 (0) | 2022.09.11 |
---|---|
#5 파일 읽고 쓰기 (실습) (0) | 2022.09.10 |
#4 파일 읽고 쓰기 (0) | 2022.09.09 |
#2 파일 열기/닫기 (0) | 2022.09.07 |
#1 리눅스 시스템 시작 (0) | 2022.09.06 |