linux ipc (mmap)
APP간 IPC통신을 하기 위해서 mmap을 사용하는 방법을 확인해 보았습니다.
file을 하나 잡고 memory mapping해서 쓰는건데 흠.. 전 shared memory에 한표를 던지고 싶네요 ^^;
아래 예제 코드는 maker가 mm file을 만들고 메모리 메핑한 후에 파일에 쓴거고..
user는 해당 mm file을 열어서 메모리 맵핑해서 읽는겁니다.
사용법은 간단하나 만약 app 이 파일을 만들어야 하는공간이 root 이면 약간 문제가 생길듯 하네요 ^^;
maker.c
- #include
- #include
- #include
- #include
- #include
- #include <sys/mman.h>
-
#define FLAG PROT_WRITE PROT_READ - int main()
- {
- int fd, *pmmap, i;
-
fd = open(“mm”, O_RDWR O_CREAT, 0666); - if(fd < 0)
- {
- perror(“open”);
- exit(1);
- }
- ftruncate(fd, 4096);
- pmmap = (int *)mmap(0, 4096, FLAG, MAP_SHARED, fd, 0);
- if(pmmap <0 )
- {
- perror(“mmap”);
- exit(1);
- }
- for(i = 0; i < 100; i++)
- {
- pmmap[i] = i;
- }
- pmmap[i+1] = -1;
- getchar();
- munmap(pmmap, 4096);
- close(fd);
- return 0;
- }
user.c
- #include
- #include <sys/stat.h>
- #include <sys/mman.h>
- #include
- #include
- #include
-
#define FLAG PROT_WRITE PROT_READ - int main(int argc, char **argv)
- {
- int fd, i=0, *maped;
- if ((fd = open(“mm”, O_RDWR, 0666)) < 0)
- {
- perror(“File Open Error”);
- exit(1);
- }
- – if ((maped = (int *) mmap(0, 4096, FLAG, MAP_SHARED, fd, 0)) == -1)
- {
- perror(“mmap error”);
- exit(1);
- }
- while(1)
- {
- if (maped[i] == -1) break;
- printf(“> %d\n”,maped[i]);
- i++;
- }
- close(fd);
- }
ref : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC