golang daemon實現

學習golang也有三四天了,今天在實現tcp server的時候發現官方沒有提供daemon的方式,在網上搜了一下,大概有下面幾個方案:

  1. nohup
  2. supervise
  3. Cgo deamon函數
  4. 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容