Is there a command similar to mkfifo but for domain sockets?
4 Answers
There is no exact equivalent of mkfifo for socket, i.e. there is no command that just creates a "hanging" socket. This is for historical reason: server's function bind(), the one that creates a socket name/inode in the filesystem, fails if the name is already used. In other words, server cannot operate on a pre-existing socket.
So if you'd created socket earlier, it would need to be removed by the server anyway first. No benefit. As you see with Gregory's answer, you can create a socket IF you keep a server for it, such as netcat. Once a server is gone, the old socket is gone. A new server has a new socket, and all clients need to re-connect, despite the socket's name being identical.
-
1This cannot be true... systemd, for example, creates sockets without attaching them to any services, and when someone attempts to connect to that socket, then systemd starts the service and hands over the socket so communication can happen. I ended up in this thread looking for an answer on how systemd does that. Nov 8, 2022 at 13:56
-
3@SenhorLucas systemd is creating the unix sockets normally, listening for connections, and then just not closing those files when it forks to launch whatever process will receive them. child processes on unix ( including linux ) inherit open files unless you explicitly close them ( or use O_CLOEXEC to do it automatically ). so either the subprocess gets the socket as its stdin/stdout (file descriptor 0/1) or it tells the process what fds to look for with envvars. this is described here: freedesktop.org/software/systemd/man/… Jan 16 at 23:47
Most recent netcat (nc) and similar programs (socat as far as I know) have domain socket options.
Else, you can have a look at ucspi-unix
-
1
-
4
You can use python:
python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"
Also C, see this answer.
-
3
mksock() { SOCK="$1" python -c "import os, socket as s; s.socket(s.AF_UNIX).bind(os.environ['SOCK'])"; }
for easy shell use:mksock /tmp/test.sock
– TinoJul 21, 2019 at 12:39
I simply use netcat
and stay listening in such a case:
nc -lkU aSocket.sock
you should use netcat-openbsd. netcat-traditional does not have -U
switch which is for Unix Domain socket.
-
3-k Forces nc to stay listening for another connection after its current connection is completed. It is an error to use this option without the -l option. -U Specifies to use UNIX-domain sockets. Aug 29, 2019 at 15:01
-
1Why, then, doesn't the
-k
option automatically turn on the-l
option? Jun 9, 2021 at 1:28