shmat() 함수는 공유 메모리를 마치 프로세스의 몸 안으로 첨부합니다.
공유 메모리는 단어 뜻에서 알 수 있듯이 하나의 프로세스에서가 아니라 여러 프로세스가 함께 사용하는 메모리를 말합니다. 이 공유 메모리를 이용하면 프로세스끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있습니다.
이렇게 같은 메모리 영역을 공유하기 위해서는 공유 메모리를 생성한 후에 프로세스의 자신의 영역에 첨부를 한 후에 마치 자신의 메모리를 사용하듯 사용합니다.
즉, 공유 메모리를 사용하기 위해서는 공유 메모리를 생성한 후에, 이 메모리가 필요한 프로세스는 필요할 때 마다 자신의 프로세스에 첨부를 한 후에 다른 메모리를 사용하듯 사용하면 되겠습니다.

헤더 |
#include <sys/type.h> #include <sys/shm.h> |
형태 |
void *shmat(int shmid, const void *shmaddr, int shmflg); |
인수 |
int shmid |
공유 메모리를 구별하는 식별 번호 |
void *shmaddr |
첨부되는 어드레스 주소. 일반적으로 NULL을 지정 |
int shmflg |
동작 옵션
shmflg |
옵션 내용 |
SHM_RDONLY |
공유 메모리를 읽기 전용으로 |
SHM_RND |
shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여 메모리 페이지 경계에 맞춘다. |
| |
반환 |
(void *) -1 |
실패 |
이외 |
프로세스에 첨부된 프로세스에서의 공유 메모리 주소 | |
예제
예제를 위해 두 개의 프로세스를 만들겠습니다. counter.c 는 공유 메모리에 1초 마다 0부터 계속 증가하는 카운터 문자열을 공유 메모리에 넣으면 show_counter.c에서 공유 메모리를 화면에 출력하도록 하겠습니다.
// 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;
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;
}
// show_counter.c counter.c가 공유 메모리에 넣는
// 카운터 문자열을 화면에 계속 출력합니다.
#include <stdio.h> // printf()
#include <unistd.h> // sleep()
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.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;
}
while( 1 )
{
if ( ( void *)-1 == ( shm_addr = shmat( shm_id, ( void *)0, 0)))
{
printf( "공유 메모리 첨부 실패n");
return -1;
}
else
{
printf( "공유 메모리 첨부 성공n");
}
printf( "%sn", (char *)shm_addr);
if ( -1 == shmdt( shm_addr))
{
printf( "공유 메모리 분리 실패n");
return -1;
}
else
{
printf( "공유 메모리 분리 성공n");
}
sleep( 1);
}
return 0;
}
]$ gcc counter.c -o counter
]$ gcc show_counter.c -o show_counter
]$ ./counter &
[1] 8077
]$ ./show_counter
공유 메모리 첨부 성공
2
공유 메모리 분리 성공
공유 메모리 첨부 성공
3
공유 메모리 분리 성공
공유 메모리 첨부 성공
4
공유 메모리 분리 성공
공유 메모리 첨부 성공
5
공유 메모리 분리 성공
공유 메모리 첨부 성공
6
공유 메모리 분리 성공
: