golang syscall.Dup2

作用:

syscall.Dup2 熟悉linux 編程的知道這個函數(shù)是做什么用。
它的作用都是用來復制一個文件的描述符。
它們經(jīng)常用來進程的stdin(0)、stdout(1)和stderr(2)
0標準輸入,1標準輸出 2進程的標準錯誤

demo

打開一個文件句柄,然后設(shè)置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,文件中生成內(nèi)容11111
如果我們 修改成syscall.Dup2(int(errfile.Fd()), 2),打開panic的注釋,
同樣生產(chǎn)err.log,但此時err.log里就是panic err,不會有fmt.Println的11111,因為設(shè)置成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主進程或者協(xié)程panic時捕獲輸出。
當然recovery 是最好的選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容