美文网首页Go
golang syscall.Dup2

golang syscall.Dup2

作者: wuhan_goer | 来源:发表于2022-02-27 15:16 被阅读0次

作用:

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 是最好的选择。

相关文章

网友评论

    本文标题:golang syscall.Dup2

    本文链接:https://www.haomeiwen.com/subject/pushrrtx.html