8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
|
/**
@file sharemem.c
@date 2006
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
4
5
6
|
@author 유영창 frog@falinux.com FALinux.Co.,Ltd.
@author 오재경 freefrug@falinux.com FALinux.Co.,Ltd.
@brief 공유메모리를 생성하고 해제한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
7
8
9
10
11
12
13
14
15
16
|
@modify
@todo
@bug
@remark
@warning
*/
//
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
17
18
|
// 저작권 에프에이리눅스(주)
// 외부공개 금지
|
8c2952457
김태훈
응용 프로그램 추가
|
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//
//----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/ipc.h>
#include <sys/shm.h>
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
37
|
/// 공유메모리 관리를 위한 구조체
|
8c2952457
김태훈
응용 프로그램 추가
|
38
39
|
typedef struct
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
40
41
42
|
int key; // 사용자가 바라보는 식별자
int id; // 공유메모리 핸들
char data[0]; // 사용자가 엑세스하는 메모리
|
8c2952457
김태훈
응용 프로그램 추가
|
43
44
45
46
47
|
} share_t;
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
48
49
|
/** @brief 공유메모리를 삭제한다.
@param key 공유메모리를 지정하는 유니크값
|
8c2952457
김태훈
응용 프로그램 추가
|
50
51
52
53
54
55
56
57
58
|
@remark
*///----------------------------------------------------------------------------
void share_delete( int key )
{
FILE *fp;
char line[128];
int id = -1;
int size;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
59
|
// shm 정보파일을 연다.
|
8c2952457
김태훈
응용 프로그램 추가
|
60
61
62
|
fp = fopen( "/proc/sysvipc/shm", "r" );
if(fp == NULL) return;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
63
|
// 첫번째 라인 무시
|
8c2952457
김태훈
응용 프로그램 추가
|
64
65
66
67
68
69
70
71
|
fgets( line, sizeof(line), fp );
while(1)
{
int tmp_key, tmp_id, tmp_perm, tmp_size;
if ( fgets( line, sizeof(line), fp ) == NULL ) break;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
72
|
// 키값과 크기를 읽어온다.
|
8c2952457
김태훈
응용 프로그램 추가
|
73
74
75
76
77
78
|
if ( sscanf( line, "%d %d %d %d", &tmp_key, &tmp_id, &tmp_perm, &tmp_size ) == 4 )
{
// printf( "SHM KEY = %d ID = %d SIZE=%d
", tmp_key, tmp_id, tmp_size );
if ( tmp_key == key )
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
79
|
id = tmp_id; // 해당하는 id 를 찾았다
|
8c2952457
김태훈
응용 프로그램 추가
|
80
81
82
83
84
85
|
size = tmp_size;
break;
}
}
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
86
|
// 파일을 닫는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
87
88
89
|
fclose( fp );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
90
|
// id 를 찾았다면 공유메모리를 삭제한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
91
92
93
94
95
96
97
|
if( id >= 0 )
{
id = shmget( key, size, 0666 | IPC_CREAT);
shmctl( id, IPC_RMID, NULL );
}
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
98
99
100
101
|
/** @brief 공유 메모리를 생성한다.
@param key 공유메모리를 지정하는 유니크값
@param size 생성할 공유메모리 크기
@return 할당받은 공유메모리
|
8c2952457
김태훈
응용 프로그램 추가
|
102
103
104
105
106
107
108
109
110
111
112
|
@remark
*///----------------------------------------------------------------------------
void *share_create( int key, unsigned int size )
{
int id;
void *ptr;
share_t *share;
// printf( "share_create key = %d
" , key );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
113
|
// 공유 메모리를 생성하여 핸들을 얻거나 이미 있으면 해당 핸들을 가져 온다.
|
8c2952457
김태훈
응용 프로그램 추가
|
114
115
116
117
118
119
|
id = shmget( key, sizeof(share_t) + size, 0666 | IPC_CREAT );
// printf("shmget id = %d
", id )
if( id < 0 )
{
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
120
121
|
// 만약에 기존에 다른 크기로 생성되어 있다면
// 이전것을 모두 삭제 처리 하고 재 생성을 요청한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
122
123
124
125
|
// printf("Exit Share Memory %08X
", key );
share_delete( key );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
126
|
// 다시 할당받는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
127
128
129
130
131
|
id = shmget( key, size + sizeof(share_t), 0666 | IPC_CREAT | IPC_EXCL );
if( id < 0 ) return NULL;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
132
|
// 공유메모리의 선두 주소를 얻어온다.
|
8c2952457
김태훈
응용 프로그램 추가
|
133
134
135
|
ptr = shmat( id, NULL, 0 );
if( ptr == NULL ) return NULL;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
136
|
// 공유메모리의 정보를 저장한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
137
138
139
140
141
142
143
|
share = (share_t *) ptr;
share->key = key;
share->id = id;
return share->data;
}
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
144
145
|
/** @brief 공유 메모리를 해제한다.
@param data share_create() 함수로 받은 메모리 포인터
|
8c2952457
김태훈
응용 프로그램 추가
|
146
147
148
149
150
151
152
153
154
155
|
@remark
*///----------------------------------------------------------------------------
void share_free( void *data )
{
share_t *share;
int id;
share = (share_t *)( data - sizeof(share_t) );
id = share->id;
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
156
|
// 공유 메모리를 어드레스 공간에서 분리한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
157
158
|
shmdt( share );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
159
|
// 공유 메모리를 사용하는 프로세스가 없다면 삭제하도록 설정한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
160
161
162
163
164
165
166
|
shmctl( id, IPC_RMID, NULL );
}
/*
//-------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
167
168
|
// 설명 :
// 주의 :
|
8c2952457
김태훈
응용 프로그램 추가
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
//-------------------------------------------------------------------------------
int get_usrmsg( char *buf, int size )
{
printf( " type msg >> " );
fgets( buf, size, stdin );
if ( buf[strlen(buf)-1] == '
' ) buf[strlen(buf)-1] = 0;
if ( 0 == strcmp( buf, "exit" ) ) return -1;
return 0;
}
//-------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
186
187
|
// 설명 : help
// 주의 :
|
8c2952457
김태훈
응용 프로그램 추가
|
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
//-------------------------------------------------------------------------------
void help( void )
{
printf( " sap_shm [r|w] [key] [size]
" \
" r|w : read or write
" \
" key : shared mem key
" \
" size : shared mem size
" \
" ex) ./sap_shm r 0x1234 256
"\
);
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
204
|
// 메세지를 보내고 받기위한 구조체
|
8c2952457
김태훈
응용 프로그램 추가
|
205
206
207
208
209
210
211
212
|
typedef struct
{
unsigned int seq;
char data[0];
} msg_t;
//------------------------------------------------------------------------------
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
213
214
|
// 설명 : main
// 주의 :
|
8c2952457
김태훈
응용 프로그램 추가
|
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
//------------------------------------------------------------------------------
int main( int argc, char **argv )
{
msg_t *pmsg;
int key, size;
char dir;
if ( argc < 4 )
{
help();
return -1;
}
dir = argv[1][0];
key = strtoul( argv[2], NULL, 0 );
size = strtoul( argv[3], NULL, 0 );
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
233
|
// 공유메모리를 생성한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
234
235
236
237
238
239
240
241
242
|
pmsg = (msg_t *)share_create( key, sizeof(msg_t) + size );
if ( NULL == pmsg )
{
printf( " fail get shared mem
" );
return -1;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
243
|
// 데이타를 공유메모리에 쓴다.
|
8c2952457
김태훈
응용 프로그램 추가
|
244
245
246
247
248
249
250
251
252
253
|
if ( dir == 'w' )
{
pmsg->seq = 0;
while( 0 == get_usrmsg( pmsg->data, size ) )
{
pmsg->seq ++;
}
pmsg->seq ++;
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
254
|
// 데이타를 공유메모리에서 읽는다.
|
8c2952457
김태훈
응용 프로그램 추가
|
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
|
else
{
unsigned int seq = 0;
while(1)
{
if ( seq != pmsg->seq )
{
printf( " --> %s
", pmsg->data );
seq = pmsg->seq;
if ( 0 == strcmp( pmsg->data, "exit" ) ) break;
}
sleep(1);
}
}
|
3061c73f6
김태훈
인코딩 변경 EUC-KR -> ...
|
274
|
// 공유메모리를 해제한다.
|
8c2952457
김태훈
응용 프로그램 추가
|
275
276
277
278
279
280
281
282
|
share_free( pmsg );
printf( " shm test end
" );
return 0;
}
*/
|