學習golang也有三四天了,今天在實現tcp server的時候發現官方沒有提供daemon的方式,在網上搜了一下,大概有下面幾個方案:
- nohup
- supervise
- Cgo deamon函數
- go通過syscall調用fork實現(這個和第3條原理一樣)
code
每種方式都各有優劣,這里說一下通過Cgo如何實現daemon:
package main
import (
"fmt"
"net"
"runtime"
)
/*
#include <unistd.h>
*/
import "C"
func main() {
// 守護進程
C.daemon(1, 1)
runtime.GOMAXPROCS(runtime.NumCPU())
fmt.Println("Starting the server ...")
listener, err := net.Listen("tcp", "localhost:8080")
if err != nil {
fmt.Println("Error listening", err.Error())
return
}
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("error accepting", err.Error())
return
}
go doServerStuff(conn)
}
}
func doServerStuff(conn net.Conn) {
for {
buf := make([]byte, 512)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading", err.Error())
return
}
fmt.Printf("Received data: %v", string(buf))
}
}
驗證
go install daemon
./bin/daemon
telnet 127.0.0.1 8080