Golang中如何检查文件是否为socket类型

Golang中如何检查文件是否为socket类型 我在网上搜索了,但没弄清楚如何实现。有没有人知道在Go中如何检查一个文件是否是套接字?

3 回复

谢谢你,NobbZ!是的,我找到了一个类似的方法。

// Check if a file is a socket.
func IsSocket(path string) bool {
	fileInfo, err := os.Stat(path)
	if err != nil {
		log.Fatal("ERROR - ", err)
	}
	return fileInfo.Mode().Type() == fs.ModeSocket
}

更多关于Golang中如何检查文件是否为socket类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


os.Stat 返回一个 fs.FileInfo,它又有一个类型为 fs.FileModeMode 字段,其中包含了你所需的信息。

因此,类似下面的代码应该可以工作:

s, _ := os.Stat("foo")
s.Mode && fs.ModeSocket == fs.ModeSocket

在Go语言中,可以使用os.Stat获取文件信息,然后通过FileModeModeSocket位来判断文件是否为socket类型。以下是示例代码:

package main

import (
    "fmt"
    "os"
)

func isSocket(path string) (bool, error) {
    fileInfo, err := os.Stat(path)
    if err != nil {
        return false, err
    }
    
    // 检查文件模式是否包含socket位
    return fileInfo.Mode()&os.ModeSocket != 0, nil
}

func main() {
    // 示例:检查/dev/log是否为socket
    isSocket, err := isSocket("/dev/log")
    if err != nil {
        fmt.Printf("错误: %v\n", err)
        return
    }
    
    if isSocket {
        fmt.Println("这是一个socket文件")
    } else {
        fmt.Println("这不是一个socket文件")
    }
}

也可以直接使用FileModeIsSocket方法(Go 1.16+):

func isSocket(path string) (bool, error) {
    fileInfo, err := os.Stat(path)
    if err != nil {
        return false, err
    }
    
    // Go 1.16+ 可以直接使用IsSocket方法
    return fileInfo.Mode().IsSocket(), nil
}

对于已打开的文件描述符,可以使用fstat系统调用:

func isSocketFile(file *os.File) (bool, error) {
    fileInfo, err := file.Stat()
    if err != nil {
        return false, err
    }
    return fileInfo.Mode()&os.ModeSocket != 0, nil
}

注意:os.ModeSocket的值是c_uint(S_IFSOCK),对应Unix系统中的socket文件类型标志位。

回到顶部