Wann ist SyscallConn() in Go für reguläre *os.File nützlich?

王林
Freigeben: 2024-02-05 23:30:03
nach vorne
792 Leute haben es durchsucht

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

Frageninhalt

Ich lese einen Go-Code (von https://github.com/KarpelesLab/reflink), der Funktionen verwendet, die auf SyscallConn() (在 *os.File definiert sind:

// 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
}
Nach dem Login kopieren

Verwenden Sie in diesem Beispiel diese Control()-Funktionen, anstatt direkt d.Fd() und s.Fd() zu verwenden. Gibt es welche? Irgendwelche Vorteile? Wofür wird im Allgemeinen func func (*os.File) SyscallConn() (syscall.RawConn, error) verwendet? Control() 函数而不是直接使用 d.Fd()s.Fd() 是否有任何优势?更一般地说, func func (*os.File) SyscallConn() (syscall.RawConn, error) 有什么用?


正确答案


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

Richtige Antwort

file.Fd() gibt einen Dateideskriptor zurück und bewirkt, dass der Dateideskriptor im Blockierungsmodus ausgeführt wird (einen Thread belegt). für Sperrvorgänge). SyscallConn macht dies nicht. Tatsächlich wurde es speziell erstellt, um einen Dateideskriptor zu erhalten, ohne ihn zu blockieren. Weitere Informationen finden Sie in 🎜dieser Frage🎜. 🎜

Das obige ist der detaillierte Inhalt vonWann ist SyscallConn() in Go für reguläre *os.File nützlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!