1 분 소요

linux app 간 통신이 필요해서 통신 방법을 찾다보니. .일단.. shared memory방식이 있어서 정리 합니다.

의외로 구현도 쉽고 확인도 쉽네요 ^^;

sample code : 5678 키로 만들고 해당 키로 만든 shared memory에 쓰고 읽어가는 코드 입니다.

1 host.c +

  1. #include <sys/ipc.h>
  2. #include <sys/shm.h>
  3. #include
  4. #include
  5. #include
  6. #include
  7. int main(int argc, char **argv)
  8. {
  9. int shmid;
  10. void *shared_memory = (void *)0;
  11. int skey = 5678;
  12. int *write_shm;
  13. // 공유메모리 공간을 만든다.
  14. shmid = shmget((key_t)skey,
  15. sizeof(int), 0666 IPC_CREAT);
  16. if(shmid == -1)
  17. {
  18. perror(“shmget failed : “);
  19. exit(0);
  20. }
  21. printf(“Key %x\n”, skey);
  22. // 공유메모리를 맵핑한다.
  23. shared_memory = shmat(shmid, (void *)0, 0);
  24. if(!shared_memory)
  25. {
  26. perror(“shmat failed : “);
  27. exit(0);
  28. }
  29. write_shm = (int *)shared_memory;
  30. *write_shm = 100;
  31. }

1 client.c

  1. #include <sys/ipc.h>
  2. #include <sys/shm.h>
  3. #include
  4. #include
  5. #include
  6. #include
  7. int main(int argc, char **argv)
  8. {
  9. int shmid;
  10. int skey = 5678;
  11. int *shared_memory;
  12. shmid = shmget((key_t)skey, sizeof(int), 0666);
  13. if(shmid == -1)
  14. {
  15. perror(“shmget failed\n”);
  16. exit(0);
  17. }
  18. shared_memory = shmat(shmid, (void *)0, 0);
  19. if(!shared_memory)
  20. {
  21. perror(“shmat failed : “);
  22. exit(0);
  23. }
  24. printf(“shm id : %d\n”, shmid);
  25. while(1)
  26. {
  27. int num = *shared_memory;
  28. printf(“key[%d] : read shm data : %d\n”, skey, num);
  29. sleep(1);
  30. }
  31. }

shared memory 할당 확인

$ipcs -m

  1. pi@raspberrypi:~ $ ipcs -m
  2. —— Shared Memory Segments ——–
  3. key        shmid      owner      perms      bytes      nattch     status
  4. 0x00000000 163840     pi         600        393216     2          dest
  5. 0x00000000 1033994241 pi         600        393216     2          dest
  6. 0x00000000 327682     pi         600        393216     2          dest
  7. 0x0000162e 1892384771 pi         666        4          0
  8. 0x00000000 517242885  pi         600        393216     2          dest
  9. 0x00000000 1908146182 pi         600        524288     2          dest
  10. 0x00000000 280428551  root       777        1228800    2          dest
  11. 0x00000000 1854996488 root       600        3686400    1          dest

ref : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC