Skip to content

Instantly share code, notes, and snippets.

@jedy
Created July 3, 2012 02:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save jedy/3037240 to your computer and use it in GitHub Desktop.
Save jedy/3037240 to your computer and use it in GitHub Desktop.
在golang中传递网络socket
package main
import (
"fmt"
"net"
"os"
"bufio"
)
func main() {
file := os.NewFile(uintptr(3), "tcp") // 0,1,2是标准输入,输出,错误输出。传进来的fd从3开始
c, err := net.FileConn(file)
if err != nil {
fmt.Println(err)
}
file.Close()
writer := bufio.NewWriter(c)
writer.WriteString("hello world\n")
writer.Flush()
c.Close()
}
package main
import (
"fmt"
"net"
"syscall"
"os"
)
func listen() {
ln, err := net.Listen("tcp", ":9999")
if err != nil {
panic(err)
}
tcpln := ln.(*net.TCPListener)
for {
c, err := tcpln.AcceptTCP()
if err != nil {
fmt.Println(err)
break
}
if err != nil {
fmt.Println(err)
break
}
go handleConn(c)
}
}
func handleConn(c *net.TCPConn) {
file, _ := c.File()
defer file.Close()
defer c.Close()
syscall.CloseOnExec(int(file.Fd())) // 设置关闭文件只对当前进程有效
allFiles := []*os.File{os.Stdin, os.Stdout, os.Stderr, file, nil}
wd, _ := os.Getwd()
_, err := os.StartProcess("s", nil, &os.ProcAttr{
Dir: wd,
Files: allFiles,
})
if err != nil {
fmt.Println(err)
}
}
func main() {
listen()
}
@sixbyter
Copy link

NewFileFileConn 不太熟悉. 请问 s.go 的作用是什么.

我运行的时候报错 : file file+net tcp: dup: bad file descriptor

uintptr(3) 究竟是什么意思呢? 我换了0, 1, 2也是报错.

请教一下, 发一些对应的知识的关键字或者链接给我就行, thanks

@DemoHn
Copy link

DemoHn commented Jul 30, 2023

NewFileFileConn 不太熟悉. 请问 s.go 的作用是什么.

我运行的时候报错 : file file+net tcp: dup: bad file descriptor

uintptr(3) 究竟是什么意思呢? 我换了0, 1, 2也是报错.

请教一下, 发一些对应的知识的关键字或者链接给我就行, thanks

s.go 是要启动的子进程, uintptr(3) 代表了从父进程传过来的 pipe 序号,0 是 stdin, 1 是 stdout, 2 是 stderr ;自然 3 就是 t.go L35 所传进来的 conn 对应的文件了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment