shmr.go 791 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package main
  2. /*
  3. #cgo linux LDFLAGS: -lrt
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <sys/mman.h>
  7. #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  8. int my_shm_open(char *name) {
  9. return shm_open(name, O_RDWR, FILE_MODE);
  10. }
  11. */
  12. import "C"
  13. import (
  14. "fmt"
  15. "unsafe"
  16. )
  17. const SHM_NAME = "my_shm"
  18. const SHM_SIZE = 4 * 1000 * 1000 * 1000
  19. type MyData struct {
  20. Col1 int
  21. Col2 int
  22. Col3 int
  23. }
  24. func main() {
  25. fd, err := C.my_shm_open(C.CString(SHM_NAME))
  26. if err != nil {
  27. fmt.Println(err)
  28. return
  29. }
  30. ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
  31. if err != nil {
  32. fmt.Println(err)
  33. return
  34. }
  35. C.close(fd)
  36. data := (*MyData)(unsafe.Pointer(ptr))
  37. fmt.Println(data)
  38. }