Skip to content

Commit 48d3c1a

Browse files
committed
Format and remove 12.3.md spaces
1 parent c874f68 commit 48d3c1a

File tree

1 file changed

+91
-91
lines changed

1 file changed

+91
-91
lines changed

Diff for: zh/12.3.md

+91-91
Original file line numberDiff line numberDiff line change
@@ -9,104 +9,104 @@
99

1010
```Go
1111

12-
d := flag.Bool("d", false, "Whether or not to launch in the background(like a daemon)")
13-
if *d {
14-
cmd := exec.Command(os.Args[0],
15-
"-close-fds",
16-
"-addr", *addr,
17-
"-call", *call,
18-
)
19-
serr, err := cmd.StderrPipe()
20-
if err != nil {
21-
log.Fatalln(err)
22-
}
23-
err = cmd.Start()
24-
if err != nil {
25-
log.Fatalln(err)
26-
}
27-
s, err := ioutil.ReadAll(serr)
28-
s = bytes.TrimSpace(s)
29-
if bytes.HasPrefix(s, []byte("addr: ")) {
30-
fmt.Println(string(s))
31-
cmd.Process.Release()
32-
} else {
33-
log.Printf("unexpected response from MarGo: `%s` error: `%v`\n", s, err)
34-
cmd.Process.Kill()
35-
}
12+
d := flag.Bool("d", false, "Whether or not to launch in the background(like a daemon)")
13+
if *d {
14+
cmd := exec.Command(os.Args[0],
15+
"-close-fds",
16+
"-addr", *addr,
17+
"-call", *call,
18+
)
19+
serr, err := cmd.StderrPipe()
20+
if err != nil {
21+
log.Fatalln(err)
3622
}
23+
err = cmd.Start()
24+
if err != nil {
25+
log.Fatalln(err)
26+
}
27+
s, err := ioutil.ReadAll(serr)
28+
s = bytes.TrimSpace(s)
29+
if bytes.HasPrefix(s, []byte("addr: ")) {
30+
fmt.Println(string(s))
31+
cmd.Process.Release()
32+
} else {
33+
log.Printf("unexpected response from MarGo: `%s` error: `%v`\n", s, err)
34+
cmd.Process.Kill()
35+
}
36+
}
3737
```
3838

3939
- 另一种是利用syscall的方案,但是这个方案并不完善:
4040
```Go
4141

42-
package main
43-
44-
import (
45-
"log"
46-
"os"
47-
"syscall"
48-
)
49-
50-
func daemon(nochdir, noclose int) int {
51-
var ret, ret2 uintptr
52-
var err uintptr
53-
54-
darwin := syscall.OS == "darwin"
55-
56-
// already a daemon
57-
if syscall.Getppid() == 1 {
58-
return 0
59-
}
60-
61-
// fork off the parent process
62-
ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
63-
if err != 0 {
64-
return -1
65-
}
66-
67-
// failure
68-
if ret2 < 0 {
69-
os.Exit(-1)
70-
}
71-
72-
// handle exception for darwin
73-
if darwin && ret2 == 1 {
74-
ret = 0
75-
}
76-
77-
// if we got a good PID, then we call exit the parent process.
78-
if ret > 0 {
79-
os.Exit(0)
80-
}
81-
82-
/* Change the file mode mask */
83-
_ = syscall.Umask(0)
84-
85-
// create a new SID for the child process
86-
s_ret, s_errno := syscall.Setsid()
87-
if s_errno != 0 {
88-
log.Printf("Error: syscall.Setsid errno: %d", s_errno)
89-
}
90-
if s_ret < 0 {
91-
return -1
92-
}
93-
94-
if nochdir == 0 {
95-
os.Chdir("/")
96-
}
97-
98-
if noclose == 0 {
99-
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
100-
if e == nil {
101-
fd := f.Fd()
102-
syscall.Dup2(fd, os.Stdin.Fd())
103-
syscall.Dup2(fd, os.Stdout.Fd())
104-
syscall.Dup2(fd, os.Stderr.Fd())
105-
}
106-
}
107-
42+
package main
43+
44+
import (
45+
"log"
46+
"os"
47+
"syscall"
48+
)
49+
50+
func daemon(nochdir, noclose int) int {
51+
var ret, ret2 uintptr
52+
var err uintptr
53+
54+
darwin := syscall.OS == "darwin"
55+
56+
// already a daemon
57+
if syscall.Getppid() == 1 {
10858
return 0
109-
}
59+
}
60+
61+
// fork off the parent process
62+
ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
63+
if err != 0 {
64+
return -1
65+
}
66+
67+
// failure
68+
if ret2 < 0 {
69+
os.Exit(-1)
70+
}
71+
72+
// handle exception for darwin
73+
if darwin && ret2 == 1 {
74+
ret = 0
75+
}
76+
77+
// if we got a good PID, then we call exit the parent process.
78+
if ret > 0 {
79+
os.Exit(0)
80+
}
81+
82+
/* Change the file mode mask */
83+
_ = syscall.Umask(0)
84+
85+
// create a new SID for the child process
86+
s_ret, s_errno := syscall.Setsid()
87+
if s_errno != 0 {
88+
log.Printf("Error: syscall.Setsid errno: %d", s_errno)
89+
}
90+
if s_ret < 0 {
91+
return -1
92+
}
93+
94+
if nochdir == 0 {
95+
os.Chdir("/")
96+
}
97+
98+
if noclose == 0 {
99+
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
100+
if e == nil {
101+
fd := f.Fd()
102+
syscall.Dup2(fd, os.Stdin.Fd())
103+
syscall.Dup2(fd, os.Stdout.Fd())
104+
syscall.Dup2(fd, os.Stderr.Fd())
105+
}
106+
}
107+
108+
return 0
109+
}
110110
```
111111

112112
上面提出了两种实现Go的daemon方案,但是我还是不推荐大家这样去实现,因为官方还没有正式的宣布支持daemon,当然第一种方案目前来看是比较可行的,而且目前开源库skynet也在采用这个方案做daemon。

0 commit comments

Comments
 (0)