Ser capaz de establecer el tiempo de espera en select() en un descriptor de archivo de puerto sobre la marcha.
¿Hay alguna manera de cambiar el tiempo de espera en select() en un FD que está abierto para un puerto serie sobre la marcha? Como en el Thread1
, se establece en NULL lo que significa que va a bloquear hasta que haya algún dato en el FD. Ahora, quisiera cambiar su comportamiento de tal manera que el Thread2
establezca un tiempo de espera en select
en Thread1
que agote el tiempo después de un tiempo especificado.
¿Es factible de alguna manera?
Suponiendo aquí que Thread1
se ejecuta primero, por lo que select()
comienza inicialmente sin tiempo de espera y el tiempo de espera se modifica luego por Thread2
mientras se está ejecutando más tarde (mientras Thread1
todavía está esperando en select()
)…
int tiempo_de_espera = 5;
struct timeval timeSpec = {tiempo_de_espera, 0};
void *pTimeout = NULL;
void *Thread2(void *)
{
while(1)
{
pTimeout = &timeSpec; // hacer que select() se agote en 5 segundos a partir de ahora...
}
}
void *Thread1(void *)
{
fd_set fdset;
while(1)
{
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
ret = select (fd + 1, &fdset, NULL, NULL, pTimeout);
if (ret < 0)
{
// manejo de errores
}
else if (ret == 0)
{
// tiempo de espera - manejo de errores
}
else
{
if (FD_ISSET(fd, &fdset))
{
bytesRead = read(fd, buffer, bytesToRead); // llamada de lectura de bloqueo
if (ret < 0)
{
// manejo de errores
}
}
}
}
}
davy.ai
Sí, es factible cambiar el tiempo de espera en
select()
en un FD que se haya abierto para un puerto serial sobre la marcha. Para lograr esto, puede haber una variable compartida entreThread1
yThread2
que especifique el tiempo de espera paraselect()
.Thread1
inicializará esta variable como NULL, lo que significa que se bloqueará hasta que haya algún dato en el FD. Ahora, siThread2
desea cambiar el comportamiento deselect()
, puede establecer un tiempo de espera en la selección enThread1
mediante la variable compartida.Thread2
puede modificar esta variable para actualizar el valor del tiempo de espera yThread1
puede comprobar cualquier cambio en esta variable y actualizar el valor del tiempo de espera deselect()
en consecuencia.El fragmento de código anterior da un ejemplo de cómo se puede lograr esto.
Thread1
está esperando enselect()
con un tiempo de esperaNULL
inicialmente mientras queThread2
está estableciendo un valor de tiempo de espera de 5 segundos en laselect()
. Este código supone queThread1
se ejecuta primero, por lo queselect()
comienza inicialmente sin tiempo de espera y el tiempo de espera se modifica posteriormente porThread2
mientrasThread1
todavía está esperando en laselect()
.