Blame view

app/app-prime-modbus/lib/fanet/sharemem.c 6.4 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
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;
  }
  
  */