角色设备hdlc driver
。在每个写入系统上,将创建呼叫hdlc frame
并由网络发送。我为所有客户端都有一个写缓冲区。 Nonblocking
和blocking IO
已实施。我有阻止写入的问题。情形:
UserA:open(DEVICE, O_WRONLY)
UserB:open(DEVICE, O_WRONLY)
UserA:select()
//选择返回:设备已准备好进行写入
UserB:write()
UserA:write()
//设备未准备好写入,导致缓冲区被UserB占用
因此,select选择返回写入的设备就绪状态,但是在select系统调用后我们被阻塞。这是一个合适的行为吗?
我想可以通过为每个开放系统调用创建写缓冲区来修复它。还有其他选择吗?
谢谢。
答案 0 :(得分:0)
这是一种竞争条件,并非您的设备所独有。申请必须为这种可能性做好准备。也就是说,只是因为select将文件描述符返回为可写(或可读或其他),并不保证对文件的后续系统调用不会阻塞。
处理此问题的常用方法是以非阻塞模式(O_NONBLOCK或O_NDELAY)打开文件描述符。然后,当您描述的情况发生时,UserA将收到写入错误(使用errno EWOULDBLOCK / EAGAIN),然后应返回选择以等待设备再次变为可写。