그냥 혼자 공부중인데
shm_open이랑 shm_unlink가 참조오류 뜸;
이유를 모르겠는게;;
man page에 나와있는거 참조해서 해봐도
웹 man page에 있는 내용 적용해봐도
언디파인이라네;;
소스에 뭔가 문제가 있는건가?;;
----------------------source----------------------------
#include <stdio.h>
#include <stdlib.h>
#include <errno.h> //errno
#include <string.h> //memcpy
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NAME_POSIX_SHM \"/proj_mytest\"
#define SZ_SHM_SEGMENT 1024
int shm_fd;
char* shm_ptr;
int main(){
char a_input[0xff];
printf(\"* SHM Nmae : %s\",NAME_POSIX_SHM);
if( (shm_fd = shm_open(NAME_POSIX_SHM, O_RDWR|O_CREAT|O_EXCL, 0660) ) > 0){
printf(\"* Create SHM\\n\");
if( ftruncate(shm_fd, SZ_SHM_SEGMENT) == -1) exit(EXIT_FAILURE);
}else{
if( errno != EEXIST ) {
printf(\"FAIL:shm_open() : %s\\n\", strerror(errno)); exit(EXIT_FAILURE);
}
shm_fd = shm_open(NAME_POSIX_SHM, O_RDWR, 0660);
if(shm_fd == -1){
//error!
}
}
shm_ptr = (char*)mmap(NULL, SZ_SHM_SEGMENT, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
if(shm_ptr == MAP_FAILED){
printf(\"FAIL:mmap()\\n\");
exit(EXIT_FAILURE);
}
printf(\"\'*\' Print current shm.\\n\");
printf(\"\'.\' EXIT. \\n\");
printf(\"otherwise change shm to your input.\\n\");
while(1){
printf(\"\\n>>\");
if(fgets(a_input, sizeof(a_input), stdin) == NULL){
//error!
}
if(a_input[0] == \'.\'){
break;
}else if(a_input[0] == \'*\'){
printf(\"shm -> \'%.*s\'\\n\",SZ_SHM_SEGMENT, shm_ptr);
}else{
memcpy(shm_ptr, a_input, strlen(a_input));
}
}
munmap(shm_ptr, SZ_SHM_SEGMENT);
printf(\"* Would you remove shm (name : %s) (y/n)\", NAME_POSIX_SHM);
fgets(a_input, sizeof(a_input),stdin);
if(a_input[0] == \'y\')
shm_unlink(NAME_POSIX_SHM);
return 0;
}
* 요건 man page 시놉시스부분
SYNOPSIS
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h> /* For O_* constants */
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
.
예제를 따라치는 것도 오랜만인데 이렇게 예제에 뒤통수 맞는건 더 오랜만이야;;;
어휴 살려주엉;; 갑갑해 미치겠음;;
아.. 지금 시놉시스부분에서 나온 헤더랑 소스 헤더가 틀린건 내가 웹에서 찾은 내용으로 고쳐서 그래 원래는 메뉴얼 내용대로 인클루드 했었츰
gcc 뒤에 링크 옵션을 걸어줘야 할텐데 -l뭐시기인데 뭔지 기억이 잘 안난다.
키사노바// 오메 땡큐 posix가 런타임이라서 -lrt 붙여야 한다넼ㅋㅋ 아따...