Golang 实现父子进程间 Unix 域套接字通信
在 Golang 中,可以使用 os 包中的 Unix 域套接字(Unix domain socket)来实现父子进程之间的通信。
下面是一个简单的例子,展示了如何在父进程和子进程之间通过 Unix 域套接字进行通信:
package main
import (
"fmt"
"net"
"os"
"os/exec"
"syscall"
)
func main() {
// 创建 Unix 域套接字
addr := &net.UnixAddr{Name: "/tmp/mysocket.sock", Net: "unix"}
listener, err := net.ListenUnix("unix", addr)
if err != nil {
fmt.Println("error listening:", err)
os.Exit(1)
}
// 创建子进程
cmd := exec.Command("/bin/sh", "-c", "echo 'hello' && sleep 10")
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
if err != nil {
fmt.Println("error starting command:", err)
os.Exit(1)
}
// 父进程等待子进程连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("error accepting connection:", err)
os.Exit(1)
}
// 父进程向子进程发送消息
_, err = conn.Write([]byte("hello from parent"))
if err != nil {
fmt.Println("error writing to connection:", err)
os.Exit(1)
}
// 子进程接收消息并输出
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("error reading from connection:", err)
os.Exit(1)
}
fmt.Println("received message from parent:", string(buf[:n]))
// 等待子进程退出
cmd.Wait()
}
在这个例子中,父进程首先创建了一个 Unix 域套接字,并等待子进程连接。然后,父进程创建了一个子进程,并向其发送了一条消息。子进程接收到消息后,输出并退出。
要运行这个例子,可以使用以下命令:
go run main.go &
这将在后台启动父进程。然后,可以使用以下命令查看进程树:
pstree -p <pid>
其中,<pid> 是父进程的进程 ID。可以看到,子进程是由父进程创建的,并且在父进程退出后仍在运行。在父进程和子进程之间的通信完成后,可以使用以下命令杀死子进程:
kill <pid>
原文地址: https://www.cveoy.top/t/topic/kQYM 著作权归作者所有。请勿转载和采集!