我有一个套接字服务器,它创建unix套接字,然后从这个unix套接字读取数据。然后我有另一个长进程应用程序,我想重定向这个进程的标准输出到我的unix套接字。我试着用这个命令测试
ping 127.0.0.1 > /tmp/unixsockettest.sock
但是我得到了-bash: /tmp/unixsockettest.sock: No such device or address
。是否有可能将应用程序输出重定向到unix套接字?
您不能使用shell i/o重定向将其重定向到Unix套接字,但您可以使用socat之类的工具(可能为您的发行版打包)来完成此任务:
ping 127.0.0.1 | socat - unix-connect:/tmp/unixsockettest.sock
Shell重定向尝试open()
其目标文件,然后dup2()
产生的文件描述符到正确的位置。不幸的是,UNIX套接字不能被open
编辑。从UNIX套接字(流或数据报)获得可写文件描述符的方法是将路径填充到struct sockaddr_un
中(在将路径填充到CC_6之后)。不幸的是,shell不会为您做这些,但是您可以通过管道连接到socat
或netcat
这样的工具,它们将完成连接,然后将它们的管道输入传输到已连接的套接字描述符中。
。,使用netcat,您可以这样做:
ping 127.0.0.1 | nc -U /tmp/unixsockettest.sock #add -u it the socket isn't streaming but datagram
(对于操作系统设计人员来说,拥有一个UNIX衍生版本,其中打开套接字文件将连接到它们可能不是一个坏的设计选择。反对它的一个理由可能是,它可能会导致打开被阻塞,并且可能会使它们打扰其他进程(绑定器),但这两种情况已经在命名管道中发生了。