Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fork a process

Tags:

fork

go

I need help understanding how to demonize a process in Go.

package main

import (
   "fmt"
   "os"
)

func start() {
   var procAttr os.ProcAttr 
   procAttr.Files = []*os.File{nil, nil, nil}
   _, err := os.StartProcess("/Path/prog", nil, &procAttr)
   if err != nil {
       fmt.Printf("%v", err)
   }
}


func main () {
   start()
} 

If you start this code on the command line the program returns control, but is still connected with cmd. Closing the cmd closes the program.

How can I decouple it from the cmd? Adding:

procAttr.Sys.HideWindow = true

Results in this error: "panic" to wrong memory pointer

like image 893
Vladislav Avatar asked Apr 05 '12 11:04

Vladislav


People also ask

How does a process fork?

When a process calls fork, it is deemed the parent process and the newly created process is its child. After the fork, both processes not only run the same program, but they resume execution as though both had called the system call.

How do I fork a process in Linux?

The syntax of fork() system call in Linux, Ubuntu is as follows: pid_t fork(void); In the syntax the return type is pid_t. When the child process is successfully created, the PID of the child process is returned in the parent process and 0 will be returned to the child process itself.

What is the purpose of forking?

Forking is to take the source code from an open source software program and develop an entirely new program. Forking is often the result of a deadlock in an open source project that is so insurmountable that all work stops.


2 Answers

I asked in 'golang-nuts', and found out that Go has a link option:

go tool 8l -o output.exe -Hwindowsgui input.8
like image 124
Vladislav Avatar answered Oct 09 '22 05:10

Vladislav


Here is a fake daemon in go; it's simple to use: https://github.com/icattlecoder/godaemon

An example:

package main

import (
    _ "github.com/icattlecoder/godaemon"
    "log"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/index", func(rw http.ResponseWriter, req *http.Request) {
        rw.Write([]byte("hello, golang!\n"))
    })
    log.Fatalln(http.ListenAndServe(":7070", mux))
}
like image 30
user2458051 Avatar answered Oct 09 '22 04:10

user2458051