【问题标题】:How can I check if a file is a Unix socket using Scala?如何使用 Scala 检查文件是否是 Unix 套接字?
【发布时间】:2016-12-02 01:37:16
【问题描述】:

我可以使用以下方法在本地创建一个套接字:

$ python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/mnt/somesocket')"

我可以通过以下命令在命令行中检查文件是否为套接字:

$ test foo.txt
$ echo $?
1
$ test -S somesocket
$ echo $?
0

如何使用 Scala 检查文件是否为套接字?

【问题讨论】:

    标签: scala sockets


    【解决方案1】:

    有多种选择,但没有一个是完美的......

    test 将调用S_ISSOCK 宏,正如您从code here 中看到的那样:

    struct stat stat_buf;
    ...
    S_ISSOCK (stat_buf.st_mode)
    

    宏本身非常简单 - 只需检查某些位是否通过位掩码设置。相关代码来自here

    #define S_IFMT  00170000
    ...
    #define S_IFSOCK 0140000
    ...
    #define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)
    

    因此,如果您有一个 stat structurest_mode 值,那么您将万事俱备。但是,这部分很棘手。

    Java NIO 通过FilesBasicFileAttributes 类提供一些POSIX 支持。但它不公开文件模式或任何套接字测试方法。 如果你不使用各种类型的文件,你可以使用isOther

    boolean isOther()

    判断文件是否不是普通文件, 目录或符号链接。

    否则你可以尝试 JNI / JNA 实现:

    https://github.com/SerCeMan/jnr-fuse/blob/master/src/main/java/ru/serce/jnrfuse/struct/FileStat.java

    Is there a Java library of Unix functions?

    最后,最简单但最慢的解决方案是从 Scala 调用进程(shell)。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2010-10-27
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2011-08-11
      • 2017-01-06
      相关资源
      最近更新 更多