github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/integration/lifecycle/shm_test/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "os/signal" 7 "syscall" 8 ) 9 10 const StateKey = 0xdeafbeef 11 const StateSize = 1 12 13 const ( 14 IPC_RMID = 0 15 IPC_CREAT = 1 << 9 16 IPC_EXCL = 2 << 9 17 ) 18 19 func main() { 20 shmid, _, errno := syscall.RawSyscall(syscall.SYS_SHMGET, StateKey, StateSize, IPC_CREAT|IPC_EXCL|0600) 21 if errno != 0 { 22 os.Exit(1) 23 return 24 } 25 26 addr, _, errno := syscall.RawSyscall(syscall.SYS_SHMAT, shmid, 0, 0) 27 if errno != 0 { 28 os.Exit(2) 29 return 30 } 31 32 sig := make(chan os.Signal, 1) 33 34 signal.Notify(sig, syscall.SIGUSR2, syscall.SIGTERM, syscall.SIGINT) 35 36 go func() { 37 <-sig 38 39 fmt.Println("releasing") 40 41 _, _, errno = syscall.RawSyscall(syscall.SYS_SHMDT, addr, 0, 0) 42 if errno != 0 { 43 os.Exit(3) 44 return 45 } 46 47 _, _, errno = syscall.RawSyscall(syscall.SYS_SHMCTL, shmid, IPC_RMID, 0) 48 if errno != 0 { 49 os.Exit(4) 50 return 51 } 52 53 os.Exit(0) 54 }() 55 56 fmt.Println("ok") 57 58 select {} 59 }