| // 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' | |
| } |