och*_*les 8 networking haskell posix inetd systemd
在inetd和systemd类型的系统中,系统可以绑定套接字并使用已经存在的套接字启动应用程序,例如提供基于套接字的服务启动.我想在我的一个Haskell守护进程中利用这个功能.
守护进程目前呼吁,socket,bindSocket,listen创建一个Socket对象,我以后可以叫accept上.要将此更改为inetd类型系统,我需要使用标准输入作为a Socket,但到目前为止我能找到的是stdin :: Handle,或者fdToHandle :: CInt -> Handle- 我都不需要.
我似乎无法找到任何类型的东西,也不会找到任何Handle -> Socket类似的东西stdin :: Socket.我能找到的最近的mkSocket是非常低级的,并且大多数其他语言(即Ruby)提供调用以将文件描述符转换为套接字而不必指定各种其他参数.
C 应用程序可以sd-daemon.h自动处理套接字传递。在 Haskell 中,必须手动模拟该文件。
您可以使用stdInput来获取stdin文件描述符。该handleToFd功能当然也可以使用。由于您想要 POSIX 特定的行为,因此您不能指望它在 Windows 上工作。
一旦你有了FD,你就别无选择,只能使用该mkSocket功能。Haskell 无法猜测您想要哪种套接字,因此您必须指定它。您最可能想要:
mkSocket fd AF_UNIX Stream defaultProtocol Listening
Run Code Online (Sandbox Code Playgroud)
请记住,这不一定是systemd将文件描述符传递给您的应用程序的方式。您必须检查LISTEN_FDS和LISTEN_PID环境变量以查看要使用哪些文件描述符以及绑定套接字是否是您的工作。代表默认套接字的默认文件描述符是 FD 3,而不是您假设的 FD 0。systemd如果服务文件需要的话,还可能为您提供多个套接字以供使用。
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |