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