반응형
자주 쓰이는 함수
shmget (shared memory get)
shmat (shared memory attach)
shmdt (shared memory detach)
예제
두개의 프로세스를 만들겠습니다. counter.c 라는 예제는 공유메모리에 1초마다 0부터 계속 증가하는 카운터 문자열을 공유메모리에 넣을 예정이구요. show_counter.c에서는 공유메모리를 화면에 출력하겠습니다.
#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define KEY_NUM 9527
#define MEM_SIZE 1024
int main(void) {
int shm_id;
void *shm_addr;
int count;
if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666))){
printf("공유메모리 생성 실패\n");
return -1;
}
if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0)))
{
printf( "공유 메모리 첨부 실패\n");
return -1;
}
count = 0;
while( 1 )
{
sprintf( (char *)shm_addr, "%d", count++); // 공유 메모리에 카운터 출력
sleep( 1);
}
return 0;
}
주의! 위 코드에서 sprintf로 count에 해당하는 값을 shm_addr에 넣는 것을 볼 수 있다.
그 때 %d, %s, %c등을 잘 써야 원하는 데이터를 정확히 넣을 수 있다 !
show_counter.c :
#include <stdio.h> // printf()
#include <unistd.h> // sleep()
#include <sys/ipc.h>
#include <sys/shm.h>
#define KEY_NUM 9527
#define MEM_SIZE 1024
int main( void)
{
int shm_id;
void *shm_addr;
if ( -1 == ( shm_id = shmget( (key_t)KEY_NUM, MEM_SIZE, IPC_CREAT|0666)))
{
printf( "공유 메모리 생성 실패\n");
return -1;
}
if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0)))
{
printf( "공유 메모리 첨부 실패\n");
return -1;
}
while( 1 )
{
printf( "%s\n", (char *)shm_addr); // 공유 메모리를 화면에 출력
sleep( 1);
}
return 0;
}
아래는 ipc 관련 명령어이다. 참고로 사용하면 좋다.
반응형