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  }