从命令行创建 Unix 命名套接字

ben*_*phy 41 unix domain socket

是否有类似于 mkfifo 但用于域套接字的命令?

kub*_*zyk 25

套接字没有与 mkfifo 完全相同的等价物,即没有仅创建“挂起”套接字的命令。这是出于历史原因:服务器的函数 bind(),在文件系统中创建套接字名称/inode 的函数,如果名称已被使用,则会失败。换句话说,服务器不能在预先存在的套接字上运行。

因此,如果您之前创建了套接字,则无论如何首先需要由服务器将其删除。没有好处。正如您在 Gregory 的回答中看到的那样,如果您为其保留服务器,则可以创建一个套接字,例如 netcat。一旦服务器消失,旧的套接字就消失了。新的服务器有一个新的套接字,尽管套接字的名称相同,但所有客户端都需要重新连接。

  • @SenhorLucas systemd 正在正常创建 unix 套接字,侦听连接,然后在它分叉启动任何将接收它们的进程时不关闭这些文件。unix(包括 linux)上的子进程继承打开的文件,除非您显式关闭它们(或使用 O_CLOEXEC 自动执行此操作)。因此,子进程要么获取套接字作为其 stdin/stdout(文件描述符 0/1),要么告诉进程使用 envvars 查找哪些 fd。这是在这里描述的:https://www.freedesktop.org/software/systemd/man/systemd-socket-activate.html (4认同)

Gre*_*SAT 17

最近的 netcat (nc) 和类似的程序(据我所知是 socat)都有域套接字选项。
否则,你可以看看 ucspi-unix

  • 好的,一旦你安装了它,你如何创建一个“套接字文件” (2认同)

ako*_*nov 16

你可以使用蟒蛇:

python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"
Run Code Online (Sandbox Code Playgroud)

还有 C,请参阅此答案

  • `mksock() { SOCK="$1" python -c "导入操作系统,套接字为 s; s.socket(s.AF_UNIX).bind(os.environ['SOCK'])"; }` 方便 shell 使用:`mksock /tmp/test.sock` (4认同)

小智 10

netcat在这种情况下,我只是使用并保持聆听:

nc -lkU aSocket.sock
Run Code Online (Sandbox Code Playgroud)

你应该使用netcat-openbsdnetcat-traditional没有-U用于 Unix 域套接字的开关。

  • -k 强制 nc 在其当前连接完成后继续侦听另一个连接。在没有 -l 选项的情况下使用此选项是错误的。-U 指定使用 UNIX 域套接字。 (2认同)