mmap 관련 컴파일 warning 메시지가 이해가 안되네요.
글쓴이: seeker / 작성시간: 수, 2003/03/26 - 1:50오후
선언이 다음처럼 되어있고요... #include <sys/mman.h> #include <fcntl.h> typedef struct en54070_info { int intNum; time_t tm; char data[ 20000 * 10 ][ 14 ]; } en54070_info_t; en54070_info_t *gptr; /* pointer to a shared memory object */ ... ( 중략 ) ... if ( ( gptr = mmap( NULL , sizeof ( en54070_info_t ) , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 ) ) == MAP_FAILED ) { f_BatchErrLogWrite( __LINE__ , "Fatal error in mmap %s\n" , strerror( errno ) ); perror( "mmap" ); exit( 56 ); } 컴파일하면 mmap부분에서 다음 warning 이 발생하는데 원인이 뭔가요? (문제가 없을듯한데...) "shmtest.c", line 287: warning: assignment type mismatch: pointer to struct en54070_info {int intNum, long tm, array[200000] of array[14] of char data} "=" pointer to char[/code]
Forums:
gptr = (en54070_info_t *)mmap( NULL , si
gptr = (en54070_info_t *)mmap( NULL , sizeof ( en54070_info_t ) , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 )
assign 할때 서로 type 이 안맞아서 그런 것입니다.
type미스매치한건 저도 알겠는데요.
MAP_FAILED 가
(void*) -1 로 잡혀있거든요.
그럼 어떻게 해야하죠?
[quote]MAP_FAILED 가 (void*) -1 로 잡혀있거든
warning 메세지가 나오면 그냥 무시하면 될것 같은데요.
그런데, 어느 환경에서 컴파일하는거죠.
gcc -Wall 로는 아무 warning 도 안나오던데.
해결했습니다.
솔라리스 5.8이구요.
mmap앞에다가 (en54070_info_t *) 를 붙이므로써
해결했습니다.
mmap이 헤더에 void*으로 나와있음에도
컴파일 경고메시지가 우변이 char* 라고 나왔네요.
#include <sys/mman.h>를 포함했음에도요...
mmap 리턴 타입
실제로 /usr/include/sys/mman.h 를 보시면
#if (_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
인 경우에는 void * 가 리턴값이지만
그렇지 않은 경우에는 (__STDC__ 가 아니거나 위의 조건이 아닌 경우)
caddr_t 가 리턴값으로 되어있습니다.
man 페이지를 보면 void * 가 리턴값으로 되어있고요.
(Solaris 7와 Solaris 8에서 확인해 보았습니다.)
POSIX 표준 (IEE Std 1003.1-2001)에는 void * 로 되어있네요.
-D_POSIX_C_SOURCE=199506L
정도 주시고 다시 컴파일 해 보세요. ㅡ.ㅡ;;
댓글 달기