作用:
syscall.Dup2 熟悉linux 编程的知道这个函数是做什么用。
它的作用都是用来复制一个文件的描述符。
它们经常用来进程的stdin(0)、stdout(1)和stderr(2)
0标准输入,1标准输出 2进程的标准错误
demo
打开一个文件句柄,然后设置syscall.Dup2(int(errfile.Fd()), 1)
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
errfile, _ := os.OpenFile("./err.log", os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0755)
syscall.Dup2(int(errfile.Fd()), 1) // 0标准输入,1标准输出 2进程的标准错误输出
go func() {
fmt.Println(11111)
//panic("err")
}()
for {
}
}
我们启动程序,会生成err.log,文件中生成内容11111
如果我们 修改成syscall.Dup2(int(errfile.Fd()), 2),打开panic的注释,
同样生产err.log,但此时err.log里就是panic err,不会有fmt.Println的11111,因为设置成2只是写入标准化错误输出。
我们在/proc/pid/fd的目录下也能找到这个打开的文件描述符
package main
import (
"os"
"syscall"
)
func main() {
errfile, _ := os.OpenFile("./err.log", os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0755)
syscall.Dup2(int(errfile.Fd()), 2)
go func() {
fmt.Println(11111)
panic("err")
}()
for {
}
}
使用场景
对于go主进程或者协程panic时捕获输出。
当然recovery 是最好的选择。