Blame view

app/app-prime-modbus/lib/common/sharemem.c 6.77 KB
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;
  }
  
  */