일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Leviathan
- css
- 취약점
- 리눅스커널
- 시스템프로그래밍
- 시스템
- write up
- 시그널
- wargame
- 리눅스
- kernel
- 드론
- 리눅스 커널
- C++
- 워게임
- 시스템 프로그래밍
- 컴퓨터구조
- 리버싱
- 프로그래밍
- radare2
- pwncollege
- Bandit
- 시스템해킹
- C언어
- 알고리즘
- 커널
- 어셈블리어
- Pwnable.kr
- pwn.college
- px4
- Today
- Total
Computer Security
#9 저수준 파일 문자/문자열 읽고 쓰기 (실습) 본문
byte stream을 저장하는 방식 write,read, pwrite, pread를 이용해서 데이터를 저장하고 읽어보자.
첫번째. 정보 쓰기
1. 기본 뼈대를 작성 해준다.
2. 이름과 나이를 저장하는 struct 를 선언한다.
3. 파라미터로 struct person 포인터를 받아오도록 하는 write_info 라는 API를 만든다.
open 함수
없으면 생성하고(O_CREAT) , 쓰기권한을 가지면서(O_WRONLY), 파일 뒷쪽에 APPEND 하게끔 해주고(O_APPEND) , 권한은 644로(0644) 설정해준 뒤, 예외처리 해준다.
write 함수
1. wirte() 함수에서는 첫번째 fd , 두번째 버퍼(사람정보p) , 세번째는 할당 메모리 를 선언 해준다.
write(fd, p, sizeof(struct person));
2. write API 의 return 값은 ssize_t 이기 때문에, 아래처럼 선언 후, ret을 정의 해준 뒤, 예외처리를 해준다.
ssize_t ret;
3. 예외처리는 1. 완전히 실패하는 경우 2. 일부분만 써지는 경우로 나누어서 예외처리해준다.
close API를 통해 열린파일을 닫아준다.
4. main 함수에서 가변길이 배열 선언 후, write_info 함수를 호출해준다.
두명을 저장해주었으니, write_info를 두번 호출 해준다. (포인터로 넘기기 때문에 주소로 넘겨준다.)
두번째. 정보 읽기
5. 파일에서 정보를 읽어서 화면에 출력하는 함수인 dump_info 를 작성해보자.
파일을 열어서 struct person 만큼 데이터를 읽어서 화면에 출력하면된다.
open함수
생성하는게 아니기 때문에 O_CREAT 가 필요하지않고, O_WRONLY 대신 O_RDONLY 가 필요하며, O_APPEND 또한 필요하지않고, 권한도 필요하지 않다.
read함수
ssize_t read(int fd, void *buf, size_t count);
struct person p; 를 선언 해주고 써주자.
여기서, read 함수는 file에 끝을 만났을때는 0을 리턴해주기 때문에 예외처리를 하나 더 해준다.
printf 함수로 읽어와준다.
do while을 이용해서 ret 이 sizeof(struct person)과 같을동안 돌려줄텐데, 결국 무한루프 형태고, 파일에 끝에 갔을땐 어차피 종료 될테니 while(1) 로 해주자.
마무리
6. 완성된 전체 코드이다.
7. gcc 명령어를 이용해 컴파일 해준 뒤, ./read 명령어를 입력해 결과 값을 확인 해보자.
정상 출력된다.!
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#11 하드링크, 소프트 링크(실습) (0) | 2022.09.16 |
---|---|
#10 파일 구조,하드링크, 소프트링크 (1) | 2022.09.15 |
#8 저수준 파일 문자/문자열 읽고 쓰기 (2) | 2022.09.13 |
#7 저수준 파일 열기/닫기, 스트림 포지션 (실습) (0) | 2022.09.12 |
#6 저수준 파일 열기/닫기, 스트림 포지션 (0) | 2022.09.11 |