select/poll 和一个写入缓冲区
select/poll and one write buffer
字符设备hdlc driver
。在每个写系统调用 hdlc frame
被创建并通过网络发送。我为所有客户准备了一个写缓冲区。 Nonblocking
和 blocking 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 等待设备再次变得可写。
字符设备hdlc driver
。在每个写系统调用 hdlc frame
被创建并通过网络发送。我为所有客户准备了一个写缓冲区。 Nonblocking
和 blocking 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 等待设备再次变得可写。