select / poll和一个写缓冲区

时间:2015-03-09 07:53:22

标签: kernel

角色设备hdlc driver。在每个写入系统上,将创建呼叫hdlc frame并由网络发送。我为所有客户端都有一个写缓冲区。 Nonblockingblocking IO已实施。我有阻止写入的问题。情形:

UserA:open(DEVICE, O_WRONLY)

UserB:open(DEVICE, O_WRONLY)

UserA:select() //选择返回:设备已准备好进行写入

UserB:write() UserA:write() //设备未准备好写入,导致缓冲区被UserB占用

因此,select选择返回写入的设备就绪状态,但是在select系统调用后我们被阻塞。这是一个合适的行为吗?

我想可以通过为每个开放系统调用创建写缓冲区来修复它。还有其他选择吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这是一种竞争条件,并非您的设备所独有。申请必须为这种可能性做好准备。也就是说,只是因为select将文件描述符返回为可写(或可读或其他),并不保证对文件的后续系统调用不会阻塞。

处理此问题的常用方法是以非阻塞模式(O_NONBLOCK或O_NDELAY)打开文件描述符。然后,当您描述的情况发生时,UserA将收到写入错误(使用errno EWOULDBLOCK / EAGAIN),然后应返回选择以等待设备再次变为可写。