[FTZ]level10
와ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ
이제 level10만 해결하면
50%네요.
뒤에꺼 해결하는데는
더 오래걸리겠죠?
공유메모리를 이용한다...?!
shmget 함수의 원형
int shmget(key_t key, size_t size, int shmflg);
key_t key : 공유메모리의 키 값, 정수로 입력 가능, IPC_PRIVATE로 인자를 가지면 개인공유메모리 생성가능
size_t size : 생성하려는 공유메모리 크기
int shmflg : 공유메모리의 flg값으로 공유메모리의 권한, 생성 시 옵션 부여.
shmat 함수의 원형
void* shmat(int smId, const void* shm_addr, int flag);
int smId : 공유메모리 식별자
const void* shm_addr : 공유메모리와 연결하고자 하는 프로세스 내부의 메모리
int flag : 속성설정
가상메모리와 물리메모리 영역을 연결해주는 함수.
memcpy 함수의 원형
void* memcpy(void* destination, const void* source, size_t num)
void* destination : 데이터가 복사될 곳의 주소로 void*형으로 형변환되어 전달
const void* source : 복사할 데이터들이 위치한 주소로 void*형으로 형변환 되어서 전달
num : 복사할 데이터의 바이트 수를 의미
return 타입은 void* destination
shmdt 함수의 원형
int shmdt(const void* shm_addr);
작업 후 공유메모리가 필요없을 때, 공유메모리와 연결된 프로세스 내부 가상메모리 연결을 해제한다.
저의 경우 자주 사용하는 함수가 아니기 때문에
찾아보면서 합니다.
정리를 해보면
shmget함수 = argument key의 값으로 할당한 shared memory의 id를 얻어오는 함수
여기서 얻은 shmid는 shmat함수를 이용하여 pointer에 메모리를 사용할 수 있도록
attach 혹은 assign하거나 attach된 메모리를 detach.
즉, shmat함수는 shared memory의 할당된 정보를 얻거나 변경 또는 삭제가 가능하다.
할당된 메모리는 프로세스가 종료되어도 유지되며, shmctl 함수를 이용해 삭제하거나 재부팅 시 초기화.
IPC는 프로세스간 통신하는 방법을 의미합니다.
명령어
$ ipcs
// 현재 공유메모리 보기
$ipcrm shm [shmid]
// 현재 연결된 공유메모리 제거
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define BUFSIZE 1024
int main() {
int shmid;
void* shmaddr;
key_t key = 7530;
char buf[BUFSIZE];
shmid = shmget(key, BUFSIZE, 0666);
// key값과 공유메모리 크기, 권한으로 id를 받아와서 shmid에 저장
shmaddr = shmat(shmid, (void*)0, 0);
//아이디와 프로세스내부의 메모리주소, 속성
memcpy(buf, shmaddr, BUFSIZE);
//but 배열공간으로 공유메모리 데이터를 1024사이즈만큼 복사
puts(buf);
//출력
shmdt(shmaddr);
//공유메모리와 프로세서간 연결 종료
}
Level11 Password is "what!@#$?".
'Wargame > FTZ' 카테고리의 다른 글
[FTZ]level12 (0) | 2019.09.07 |
---|---|
[FTZ]level11 (0) | 2019.09.07 |
[FTZ]level9 (0) | 2019.09.05 |
[FTZ]level8 (0) | 2019.09.05 |
[FTZ]level7 (0) | 2019.09.05 |
댓글