shmw.go 897 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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_new(char *name) {
  9. shm_unlink(name);
  10. return shm_open(name, O_RDWR|O_CREAT|O_EXCL, FILE_MODE);
  11. }
  12. */
  13. import "C"
  14. import (
  15. "fmt"
  16. "unsafe"
  17. )
  18. const SHM_NAME = "my_shm"
  19. const SHM_SIZE = 4 * 1000 * 1000 * 1000
  20. type MyData struct {
  21. Col1 int
  22. Col2 int
  23. Col3 int
  24. }
  25. func main() {
  26. fd, err := C.my_shm_new(C.CString(SHM_NAME))
  27. if err != nil {
  28. fmt.Println(err)
  29. return
  30. }
  31. C.ftruncate(fd, SHM_SIZE)
  32. ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
  33. if err != nil {
  34. fmt.Println(err)
  35. return
  36. }
  37. C.close(fd)
  38. data := (*MyData)(unsafe.Pointer(ptr))
  39. data.Col1 = 100
  40. data.Col2 = 876
  41. data.Col3 = 8021
  42. }