Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 |
30 | 31 |
Tags
- 3Ds max 기초
- 개체 외곽 하이라이트 기준선 없애는 법
- foreground process
- 뷰포트
- bash shell 변수
- pane & desktop
- atexit()
- 3D 배경 그래픽
- background process
- 생활코딩 복습
- 섭페
- houdini
- substance painter
- exit()
- exec 시스템 콜
- wait 시스템 콜
- Redirection
- 후디니
- copy-on-write
- bg 명령어
- Symmetry
- bash shell 조건문
- 추가 업로딩 중
- 섭페에서 텍스처 추출
- msync
- ps 명령어
- bash shell 반복문
- mmap
- fork 시스템 콜
- Standard Stream
Archives
- Today
- Total
Researcher to Developer
IPC 기법 관련 시스템 콜 - 공유 메모리(shmid, shmget, shmaddr, shmdt, shmctl, etc) 본문
카테고리 없음
IPC 기법 관련 시스템 콜 - 공유 메모리(shmid, shmget, shmaddr, shmdt, shmctl, etc)
Probe29 2021. 1. 2. 18:16ipcs
현재 커널 공간에 생성되어 있는 message queue, 공유 메모리 segments, semaphore arrays 정보를 표시하는 명령어
#공유 메모리 (shared memory)
노골적으로 커널 영역에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식
메세지 큐 처럼 FIFO 방식이 아니라 해당 메모리 주소를 변수처럼 접근하는 방식
공유 메모리 key를 가지고 여러 프로세스가 접근이 가능하다.
메세지 큐와 마찬가지로 key를 가지고 있다.
#공유 메모리 코드 예제
1. 공유 메모리 생성
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
// key : 임의 숫자 또는 ftok 함수로 생성한 키 값
// size : 공유 메모리 크기
// shmflg : 공유 메모리를 어떤 권한으로 만들꺼냐, 속성에 대한 함수
// 리턴 값 : 공유 메모리 식별자 리턴
// 예제
shmid =shmget((ket_t)1234, SIZE, IPC_CREAT|0666))
2. 공유 메모리 연결
키가 생성이 되면 특정한 프로세스에 있는 변수에 이 메모리르 매핑을 시켜줘야한다.
#include <sys/type.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
// shmid : shmget 함수로 생성한 공유 메모리 식별자, ID
// shmaddr : 공유 메모리 연결 주소 (보통 (char *)NULL으로 설정하면, 알아서 적절한 주소로 연결,매핑)
// shmflg : 공유 메모리의 읽기/쓰기 권한 (보통 0이면 읽기/쓰기 가능, SHM_RDONLY면 읽기만 가능)
// 리턴 값 : 성공 시 연결된 공유 메모리의 시작 주소를 리턴
// 예제
shmaddr = (char *)shmat(shmid, (char *)NULL, 0)
shmaddr 이 변수를 공유 메모리에 해제 시킬 수 도 있다.
3. 공유 메모리 해제
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(char *shmaddr);
해제만 하면 삭제가 아니기때문에 데이터가 남는다.
4. 공유 메모리 읽기/쓰기
포인터 변수처럼 사용하면 됨
공유 메모리에서 읽기
printf("%s\n", (char *)shmaddr)
공유 메모리에서 쓰기
strcpy((char *)shmddr, "Linux Programming")
5. 공유 메모리 삭제
shmctl()
공유 메모리 삭제에 사용되는 명령어
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
// shmid : shmget 함수로 생성한 공유 메모리 식별자
// cmd : 수행할 제어 기능 (ex. IPC_RMID - shmid 로 지정한 공유 메모리 제거)
// buf : 제어 기능에 사용되는 공유 메모리 구조체의 구조
// 예제
shmctl(shmid, IPC_RMID, (struct shmid_ds *)NULL);