50

Is there a command similar to mkfifo but for domain sockets?

4 Answers 4

30

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.

2
  • 1
    This 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
17

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

2
  • 1
    On Debian: # sudo apt-get install netcat-openbsd Apr 24, 2017 at 16:43
  • 4
    ok once you install that, how do you create a "socket file" May 20, 2018 at 4:30
17

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.

1
  • 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
    – Tino
    Jul 21, 2019 at 12:39
17

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.

2
  • 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
  • 1
    Why, then, doesn't the -k option automatically turn on the -l option? Jun 9, 2021 at 1:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.