我有两个进程在主/副本设置中通过 Unix 域套接字进行通信。副本需要定期向主副本请求指导,但只有当主副本表明它准备好提供所述指导时,它才应该这样做。如果主准备就绪,副本应该查询主并等待响应;否则,它应该继续当前的任务。
通常,无论主服务器是否准备就绪,我都会使用 POSIX 信号量与副本通信——它既快速又轻便。不幸的是,我碰巧在研究一个不支持 POSIX 共享内存的系统。因此,我只有 Unix 套接字。
我知道非阻塞读取非常快,所以我想知道我是否可以做这样的事情:
- 打开副本和主副本之间的连接。
- 将副本的末端设置为非阻塞。
- 定期检查副本是否可以从主副本读取。
- 如果读取成功,将套接字切换为阻塞并查询主套接字。查询完成后,将套接字返回到非阻塞状态。
- 如果读取失败,则继续直到下一次检查。
我能否在阻塞和非阻塞行为之间重复切换套接字?
最佳答案
You can使用 fcntl:
int file_descriptor;
int flags;
// open file_descriptor
flags = fcntl(file_descriptor, F_GETFL, 0);
flags &= ~O_NONBLOCK; // set blocking
flags |= O_NONBLOCK; // set non-blocking
fcntl(file_descriptor, F_SETFL, flags);
但我认为如果你只使用两个套接字,你的程序会更简单。一个用于控制(非阻塞),一个用于数据(阻塞)。使用控制套接字传递“就绪”/“未准备好”消息,使用数据套接字为您提供“指导”。
这消除了打开/关闭套接字或重复修改其配置的需要,并且应该简化程序中的控制流。它还将程序中的数据流和控制流分开,这通常是一种很好的做法。
关于我可以在阻塞和非阻塞行为之间反复切换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575506/