🚀 With the aid of a named pipe to achieve fast communication with the process
- named-pipe-ipc(Not limited to parent-child processes)
- full-duplex communication
go get github.com/whiteCcinn/named-pipe-ipc
package main
import (
"context"
named_pipe_ipc "github.com/whiteCcinn/named-pipe-ipc"
"log"
"time"
)
func main() {
ctx, _ := context.WithTimeout(context.Background(), 3*time.Second)
// use pipe-IPC
nctx, err := named_pipe_ipc.NewContext(ctx, "./", named_pipe_ipc.S)
if err != nil {
log.Fatal(err)
}
go func() {
go func() {
for {
dsm, err := nctx.Recv(true)
if err != nil && err.Error() != named_pipe_ipc.PipeClosedMessage {
log.Fatal(err)
}
log.Println("from clint", dsm.Payload())
_, err = nctx.Send(dsm.ResponsePayload(named_pipe_ipc.Message("send to client")))
if err != nil {
log.Fatal(err)
}
}
}()
err = nctx.Listen()
if err != nil {
log.Fatal(err)
}
}()
for {
log.Println("I am server")
time.Sleep(5 * time.Second)
if err := nctx.Close(); err != nil {
log.Println(err)
}
break
}
}
package main
import (
"context"
named_pipe_ipc "github.com/whiteCcinn/named-pipe-ipc"
"log"
)
func main() {
nctx, err := named_pipe_ipc.NewContext(context.Background(), "./", named_pipe_ipc.C)
if err != nil {
log.Fatal(err)
}
_, err = nctx.Send(named_pipe_ipc.Message("nihao"))
if err != nil {
log.Fatal(err)
}
msg, err := nctx.Recv(true)
if err != nil {
log.Fatal(err)
}
log.Println("from server", msg)
}
}
root@0140ee5d78cf:/www/example# go run server.go
2021/05/20 07:47:05 I am server
2021/05/20 07:47:10 I am server
2021/05/20 07:47:12 from clint nihao
2021/05/20 07:47:12 pass
2021/05/20 07:47:15 I am server
# other tty
root@0140ee5d78cf:/www/example# go run client.go
2021/05/20 07:47:12 from server send to client
## server
go run example/noblock_server.go
# other window
i="0";while [ $i -lt 10 ]; do nohup go run example/noblock_client.go > output.$i 2>&1 &;i=$[$i+1];done
# see the out.* content