shm.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package shm
  2. import (
  3. "log"
  4. _ "syscall"
  5. "unsafe"
  6. )
  7. type nameStr struct {
  8. name []byte
  9. age int
  10. }
  11. func MakeShareMemory(shmId uint32) uintptr {
  12. //string方式
  13. //shareName,_ := syscall.BytePtrFromString("Global/1")
  14. //shareNameId := (*uint16)(unsafe.Pointer(shareName))
  15. //数值方式
  16. smid := (*uint16)(unsafe.Pointer(&shmId))
  17. segment := CreateSharedMemory(1024, smid)
  18. if segment == 0 {
  19. //under linux,segment may have not been destroyed if the MS crashed:destroy
  20. //See /proc/sysvipc/shm for the list of allocated segments
  21. //如果是重新直接使用的话,这边不能做销毁操作,应该直接使用共享内存,快速启动进程
  22. destroySharedMemory(smid, true)
  23. //util.InfoF("destroyed shared memory segment,smid:%v", smid)
  24. segment = CreateSharedMemory(1024, smid)
  25. }
  26. if segment == 0 {
  27. //util.InfoF("cannot create shared memory segment,smid:%v", smid)
  28. return uintptr(0)
  29. }
  30. //defer CloseShardMemory(segment)
  31. return segment
  32. }
  33. func ReadSharedMemory(shmId uint32) uintptr {
  34. smid := (*uint16)(unsafe.Pointer(&shmId))
  35. return AccessSharedMemory(smid)
  36. }
  37. func TestMake() {
  38. segment := MakeShareMemory(1)
  39. if segment == 0 {
  40. return
  41. }
  42. nameList := (*nameStr)(unsafe.Pointer(segment))
  43. nameList.name = []byte("chy1")
  44. nameList.age = 1111
  45. log.Printf("make:%v", segment)
  46. /*
  47. *nameList = append(*nameList, &nameStr{name:[]byte("chy1"),age:30})
  48. *nameList = append(*nameList, &nameStr{name:[]byte("chy2"),age:31})
  49. *nameList = append(*nameList, &nameStr{name:[]byte("chy13"),age:32})
  50. */
  51. }
  52. func TestRead() {
  53. segment := ReadSharedMemory(1)
  54. if segment == 0 {
  55. return
  56. }
  57. nameList := (*nameStr)(unsafe.Pointer(segment))
  58. log.Printf("namelist:%v %v", string(nameList.name), nameList.age)
  59. /*
  60. if nameList != nil {
  61. for key,_ :=range *nameList {
  62. log.Printf("name:%v age:%v", string((*nameList)[key].name), (*nameList)[key].age)
  63. }
  64. }
  65. */
  66. }