select/poll 和一个写入缓冲区

select/poll and one write buffer

字符设备hdlc driver。在每个写系统调用 hdlc frame 被创建并通过网络发送。我为所有客户准备了一个写缓冲区。 Nonblockingblocking IO 已实施。我有阻止写入的问题。场景:

用户A:open(DEVICE, O_WRONLY)

用户 B:open(DEVICE, O_WRONLY)

UserA: select() //select returns: 设备已准备好写入

用户B:write() UserA: write() //设备未准备好写入,因为缓冲区已被 UserB

占用

因此,select returns 设备准备好写入,但我们在 select 之后的写入系统调用中被阻止。这是一种合适的行为吗?

我想可以通过为每个打开的系统调用创建写缓冲区来解决这个问题。还有其他选择吗?

谢谢。

这是一种竞争条件,并非您的设备独有。应用程序必须为这种可能发生的情况做好准备。也就是说,仅仅因为 select return 文件描述符是可写的(或可读的或其他)并不能保证对该文件的后续系统调用不会阻塞。

通常的处理方式是以非阻塞模式打开文件描述符(O_NONBLOCK 或 O_NDELAY)。然后,当您描述的情况发生时,UserA 将收到写入错误(errno EWOULDBLOCK/EAGAIN),然后应该 return 到 select 等待设备再次变得可写。