(본 강의 노트는 한빛 아카데미의 <유닉스 시스템 프로그래밍> 책을 기반으로 하고 있습니다)
Ch07. 시그널
학습목표
- 통신프로그램이 무엇인지 이해한다.
- 메모리 매핑을 이용한 IPC 기법을 이해한다.
- 메모리 매핑 함수를 사용해 프로그램을 작성할 수 있다.
목차
1. 메모리 매핑의 개념
2. 메모리 매핑 함수
3. 메모리 매핑 해제 함수
4. 메모리 매핑의 보호모드 변경
5. 파일의 크기 확장
6. 매핑된 메모리 동기화
7. 데이터 교환하기
1. 메모리 매핑의 개념
메모리 매핑
- 파일을 프로세스의 메모리에 매핑
- 프로세스에 전달할 데이터를 저장한 파일을 직접 프로세스의 가상 주소 공간으로 매칭
- read, write 함수를 사용하지 않고도 프로그램 내부에서 정의한 변수를 사용해 파일에서 데이터를 읽거나 쓸 수 있음
메모리 매핑과 기존 방식의 비교
- 기존 방식
fd = open(…);
lseek(fd, offset, whence);
read(fd, buf, len);
- 메모리 매핑 함수 사용 : read 함수를 사용하지 않고도 데이터 접근 가능
fd = open(…);
addr = mmap((caddr_t)0, len, (PROT_READ|PROT_WRITE), MAP_PRIVATE, fd, offset);
2. 메모리 매핑 함수
메모리 매핑: mmap()
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
3. 메모리 매핑 해제 함수
메모리 매핑 해제 : munmap()
#include <sys/mman.h>
int munmap(void *addr, size_t len);
- addr이 가리키는 영역에 len 크기만큼 할당해 매핑한 메모리 해제
- 해제한 메모리에 접근하면 SIGSEGV 또는 SIGBUS 시그널 발생
4. 메모리 매핑의 보호모드 변경
보호모드 변경 : mprotect()
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
- mmap 함수로 메모리 매핑을 수행할 때 초기값을 설정한 보호모드를 mprotect 함수로 변경 가능
- prot에 지정한 보호모드로 변경
5. 파일의 크기 확장
파일의 크기와 메모리 매핑
- 존재하지 않거나 크기가 0인 파일은 메모리 매핑을 할 수 없음
- 빈 파일 생성시 파일의 크기를 확장한 후 메모리 매핑을 해야 함
경로명을 사용한 파일 크기 확장 : trucate()
#include <unistd.h>
int truncate(const char *path, off_t length);
- path에 지정한 파일의 크기를 length로 지정한 크기로 변경
파일 기술자를 사용한 파일 크기 확장 : ftrucate()
#include <unistd.h>
int ftruncate(int fildes, off_t length);
- 일반 파일과 공유 메모리에만 사용 가능
- 이 함수로 디렉토리에 접근하거나 쓰기 권한이 없는 파일에 접근하면 오류 발생
6. 매핑된 메모리 동기화
매핑된 메모리 동기화
- 매핑된 메모리의 내용과 백업 내용이 일치하도록 동기화 필요
매핑된 메모리 동기화 : msync()
#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
7. 데이터 교환하기
메모리 매핑을 이용한 데이터 교환
- 부모 프로세스와 자식 프로세그가 메모리 매핑을 사용하여 데이터 교환 가능
'Computer Science > 유닉스프로그래밍' 카테고리의 다른 글
[유닉스 시스템 프로그래밍] Ch10. 시스템V의 프로세스간 통신 (0) | 2020.11.28 |
---|---|
[유닉스 시스템 프로그래밍] Ch09. 파이프 (0) | 2020.11.23 |
[유닉스 시스템 프로그래밍] Ch07. 시그널 (0) | 2020.11.04 |
[유닉스 시스템 프로그래밍] Ch06. 프로세스 생성과 실행 (0) | 2020.10.19 |
[유닉스 시스템 프로그래밍] Ch05. 프로세스 정보 (0) | 2020.10.19 |