Подскажите пожалуйста, можно ли из обработчика tto, каким-то образом узнать открыто ли устройство?
У меня есть некий самописный драйвер, который представляет собой пару устройств символьного ввода/вывода (например /dev/v1 и /dev/v2) связанных друг с другом, v2 связан с v1 через (TTYDEV*)dev->extra (и наоборот так же).
Когда в v1 поступают данные, они просто передаются в v2. Код функции:
int tto ( TTYDEV *dev, int action, int arg1 )
{
TTYDEV *ext = dev->extra;
int status = 0;
char c;
switch ( action )
{
//case TTO_STTY:
//case TTO_CTRL:
//case TTO_LINESTATUS:
// return 0;
case TTO_DATA:
//case TTO_EVENT:
break;
default:
return 0;
}
while ( dev->obuf.cnt > 0 )
{
/*
// Если входной буфер внешнего tty заполнился - уходим.
if ( ext->ibuf.cnt >= ext->ibuf.size ) {
dev->un.s.tx_tmr = 3; // Timeout
break;
}
*/
if ( dev->flags & (OHW_PAGED|OSW_PAGED) && !(dev->xflags & OSW_PAGED_OVERRIDE) ) {
dev->un.s.tx_tmr = 3; // Timeout
break;
}
// Получаем символ из obuf
dev_lock( dev );
c = tto_getchar( dev );
dev_unlock( dev );
// Отправляем на внешнее устройство
status |= tti( ext, c );
dev->un.s.tx_tmr = 3; // Timeout
if ( dev->xflags & OSW_PAGED_OVERRIDE )
{
atomic_clr(&dev->xflags, OSW_PAGED_OVERRIDE);
break;
}
}
if ( status )
iochar_send_event( ext );
return tto_checkclients(dev);
}
Если, например в v1 писать данные, а v2 не открыт на чтение, то данные буферизируются в его входном буфере и если его открыть спустя какое-то время, то будут вычитаны ранее записанные в него данные (даже если v1 уже отвалился). Мне требуется, в случае если v2 не открыт на чтение, не производить в него запись из v1.
Спасибо!
Возможное решение:Нашел в структуре TTYDEV атрибутивную запись на устройство, в которой есть поле
ext->attr.rcount - число читателей, наверное можно использовать его.