首頁 > 後端開發 > Golang > 主體

在 Go 中,什麼時候 SyscallConn() 對常規 *os.File 有用?

王林
發布: 2024-02-05 23:30:03
轉載
793 人瀏覽過

在 Go 中,什么时候 SyscallConn() 对常规 *os.File 有用?

問題內容

我正在閱讀一些使用SyscallConn()(在*os.File 上定義的函數)的Go 程式碼(來自https://github.com/KarpelesLab/reflink):

// reflinkInternal performs the actual reflink action without worrying about fallback
func reflinkInternal(d, s *os.File) error {
    ss, err := s.SyscallConn()
    if err != nil {
        return err
    }
    sd, err := d.SyscallConn()
    if err != nil {
        return err
    }
    var err2, err3 error
    err = sd.Control(func(dfd uintptr) {
        err2 = ss.Control(func(sfd uintptr) {
            // int ioctl(int dest_fd, FICLONE, int src_fd);
            err3 = unix.IoctlFileClone(int(dfd), int(sfd))
        })
    })
    if err != nil {
        // sd.Control failed
        return err
    }
    if err2 != nil {
        // ss.Control failed
        return err2
    }
    if err3 != nil && errors.Is(err3, unix.ENOTSUP) {
        return ErrReflinkFailed
    }
    // err3 is ioctl() response
    return err3
}
登入後複製

在此範例中,使用這些Control() 函數而不是直接使用d.Fd()s.Fd() 是否有任何優勢?更一般地說, func func (*os.File) SyscallConn() (syscall.RawConn, error) 有什麼用?


正確答案


file.Fd() 傳回一個檔案描述符,並且它使檔案描述符以阻塞模式運行(佔用一個線程以進行阻塞操作)。 SyscallConn 不這樣做。事實上,它是專門為了獲取文件描述符而不使其阻塞而創建的。請參閱此問題以了解更多資訊

以上是在 Go 中,什麼時候 SyscallConn() 對常規 *os.File 有用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!