[UNIX] 공유 메모리

Taegang Yun·2023년 12월 9일
1

Unix 프로그래밍

목록 보기
16/19

공유 메모리 식별자 생성 : shmget()

  • msgget()과 마찬가지로 플래그를 IPC_CREAT과 IPC_EXCL 사용
  • 공유 메모리 식별자와 관련된 공유 메모리와 데이터 구조체가 새로 생성되는 경우
    • key가 IPC_PRIVATE일 경우
    • key가 0이 아니며 다른 식별자와 관련되어 있지 않고, 플래그(msgflg)에 IPC_CREAT가 설정 될 경우
int main(){
	key_t key;
	int shmid;
	
	key = ftok("shmfile", 1);

	shmid = shmget(key, 1024, IPC_CREAT|0644);

}

공유 메모리 연결 : shmat()

  • shmaddr에는 특별한 경우가 아니면 NULL을 입력
  • shmflg가 0이면 읽기 쓰기 가능, SHM_RDONLY면 읽기만

공유 메모리 연결 해제 : shmdt()

  • shmaddr에 공유 메모리 시작 주소 지정

공유 메모리 제어 : shmctl()

  • PC_STAT : 현재 공유 메모리의 정보를 buf로 지정한 제어 기능을 수행
  • IPC_SET : 지정한 값으로 변경
  • IPC_RMID : shmid로 지정한 공유메모리 제거 후 데이터 구조체 제거
  • IPC_INFO
int main(){
	int shmid, i;
	char *shmaddr, *shmaddr2;

	shmid = shmget(IPC_PRIVATE, 20, IPC_CREAT|0644);

	switch(fork()){
		case 0:
			shmaddr = (char*)shmat(shmid, NULL, 0);
			for(i = 0 ; i < 10; i++)
				shmaddr[i] = 'a' + i;
			shmdt(shmaddr);
			exit(0);
			break;
		default:
			wait(0);
			shmaddr2 = shmat(shmid, NULL, 0);
			for(i = 0; i < 10; i++)
				printf("%c ", shmaddr2[i]);
			sleep(5);
			shmdt(shmaddr2);
			shmctl(shmid, IPC_RMID, NULL);
	}
}

Listener, Talker 예제 코드

  1. Listener(Server)
void handler(int dummy){}}

int main(){
	key_t key;
	int shmid;
	void *shmaddr;
	char buf[1024];
	sigset_t mask;

	key = ftok("shmfile", 1);
	shmid = shmget(key, 1024, IPC_CREAT|0666);

	sigfillsest(&mask);
	sigdelset(&mask, SIGUSR1);
	signal(SIGUSR1, handler);

	printf("Listener wait for Talker\n");
	sigsuspend(&mask);

	printf("Listener Start\n");
	shmaddr = shmat(shmid, NULL, 0);
	strcpy(buf, shmaddr);
	
	printf("Listener Received\n");
	
	strcpy(shmaddr, "Have a nice day\n");
	sleep(3);
	shmdt(shmaddr);
}

공유 메모리와의 연결을 해제
  1. Talker(Client)
int main(int argc, char** argv){
	key_t key;
	int shmid;
	void *shmaddr;
	char buf[1024];
	
	key = ftok("shmfile", 1);
	shmid = shmget(key, 1024, 0);

	shmaddr = shmat(shmid, NULL, 0);
	strcpy(shmaddr, "Hello, I'm talker\n");

	kill(atoi(argv[1]), SIGUSR1); //argv[1] = lister의 pid
	sleep(2);
	strcpy(buf, shmaddr);

	printf("Listener said : %s\n", buf);
	system("ipcs -mo");
	shmdt(shmaddr);
	shmctl(shmid, IPC_RMID, NULL);
}

공유 메모리 연결을 해제하고 공유 메모리 제거
profile
언젠간 전문가가 되겠지

0개의 댓글