Rumah > pembangunan bahagian belakang > Golang > Dalam Go, bilakah SyscallConn() berguna untuk *os.File biasa?

Dalam Go, bilakah SyscallConn() berguna untuk *os.File biasa?

王林
Lepaskan: 2024-02-05 23:30:03
ke hadapan
849 orang telah melayarinya

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

Kandungan soalan

Saya sedang membaca beberapa kod Go (dari https://github.com/KarpelesLab/reflink) yang menggunakan fungsi yang ditakrifkan pada SyscallConn() (在 *os.File:

// 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
}
Salin selepas log masuk

Dalam contoh ini, gunakan fungsi Control() ini dan bukannya terus menggunakan d.Fd() dan s.Fd() Adakah terdapat sebarang Apa-apa kelebihan? Secara umum, fungsi func (*os.File) SyscallConn() (syscall.RawConn, error) digunakan untuk apa? Control() 函数而不是直接使用 d.Fd()s.Fd() 是否有任何优势?更一般地说, func func (*os.File) SyscallConn() (syscall.RawConn, error) 有什么用?


正确答案


file.Fd() 返回一个文件描述符,并且它使文件描述符以阻塞模式运行(占用一个线程以进行阻塞操作)。 SyscallConn

Jawapan betul

file.Fd() mengembalikan deskriptor fail dan ia menyebabkan deskriptor fail berjalan dalam mod menyekat (menduduki benang untuk operasi menyekat). SyscallConn tidak melakukan ini. Malah, ia dicipta khusus untuk mendapatkan deskriptor fail tanpa menyekatnya. Sila lihat 🎜soalan ini untuk maklumat lanjut🎜. 🎜

Atas ialah kandungan terperinci Dalam Go, bilakah SyscallConn() berguna untuk *os.File biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan