| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build (darwin && !ios) || (linux && !android) |
| // +build darwin,!ios linux,!android |
| |
| package unix_test |
| |
| import ( |
| "log" |
| |
| "golang.org/x/sys/unix" |
| ) |
| |
| func ExampleSysvShmGet() { |
| // create shared memory region of 1024 bytes |
| id, err := unix.SysvShmGet(unix.IPC_PRIVATE, 1024, unix.IPC_CREAT|unix.IPC_EXCL|0o600) |
| if err != nil { |
| log.Fatal("sysv shm create failed:", err) |
| } |
| |
| // warning: sysv shared memory segments persist even after after a process |
| // is destroyed, so it's very important to explicitly delete it when you |
| // don't need it anymore. |
| defer func() { |
| _, err := unix.SysvShmCtl(id, unix.IPC_RMID, nil) |
| if err != nil { |
| log.Fatal(err) |
| } |
| }() |
| |
| // to use a shared memory region you must attach to it |
| b, err := unix.SysvShmAttach(id, 0, 0) |
| if err != nil { |
| log.Fatal("sysv attach failed:", err) |
| } |
| |
| // you should detach from the segment when finished with it. The byte |
| // slice is no longer valid after detaching |
| defer func() { |
| if err = unix.SysvShmDetach(b); err != nil { |
| log.Fatal("sysv detach failed:", err) |
| } |
| }() |
| |
| // Changes to the contents of the byte slice are reflected in other |
| // mappings of the shared memory identifer in this and other processes |
| b[42] = 'h' |
| b[43] = 'i' |
| } |