mirror of https://github.com/hslam/ipc.git
ed1be34b5c | ||
---|---|---|
.gitignore | ||
.travis.yml | ||
LICENSE | ||
README.md | ||
ftok.go | ||
ipc.go | ||
ipc_test.go | ||
msg.go | ||
sem.go | ||
shm.go |
README.md
ipc
Package ipc provides a way to use System V IPC. System V IPC includes three interprocess communication mechanisms that are widely available on UNIX systems: message queues, semaphore, and shared memory.
Features
Get started
Install
go get github.com/hslam/ipc
Import
import "github.com/hslam/ipc"
Usage
Example
package main
import (
"encoding/binary"
"flag"
"fmt"
"github.com/hslam/ipc"
"os"
"os/signal"
"syscall"
)
var send = flag.Bool("s", true, "send")
func main() {
flag.Parse()
key, _ := ipc.Ftok("/tmp", 0x22)
semid, _ := ipc.Semget(key)
defer ipc.Semrm(semid)
shmid, data, _ := ipc.Shmgetat(key, 128, ipc.IPC_CREAT|0600)
defer ipc.Shmrm(shmid)
defer ipc.Shmdt(data)
msgid, _ := ipc.Msgget(key, ipc.IPC_CREAT|0600)
defer ipc.Msgrm(msgid)
var text string
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
defer close(quit)
if *send {
fmt.Println("Enter:")
buf := make([]byte, 10)
for {
fmt.Scanln(&text)
if _, err := ipc.Semp(semid, ipc.SEM_UNDO); err != nil {
return
}
copy(data, text)
if _, err := ipc.Semv(semid, ipc.SEM_UNDO); err != nil {
return
}
n := binary.PutUvarint(buf, uint64(len(text)))
if err := ipc.Msgsnd(msgid, 1, buf[:n], 0600); err != nil {
return
}
}
} else {
fmt.Println("Recv:")
for {
m, err := ipc.Msgrcv(msgid, 1, 0600)
if err != nil {
return
}
length, _ := binary.Uvarint(m)
if _, err := ipc.Semp(semid, ipc.SEM_UNDO); err != nil {
return
}
text = string(data[:length])
if _, err := ipc.Semv(semid, ipc.SEM_UNDO); err != nil {
return
}
fmt.Println(text)
}
}
}()
<-quit
}
Output
Enter a word.
$ go run main.go -s=true
Enter:
HelloWorld
In another terminal receive this word.
$ go run main.go -s=false
Recv:
HelloWorld
License
This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)
Author
ipc was written by Meng Huang.