es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
                }
            }
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for 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 entre Thread1 y Thread2 que especifique el tiempo de espera para select().

    Thread1 inicializará esta variable como NULL, lo que significa que se bloqueará hasta que haya algún dato en el FD. Ahora, si Thread2 desea cambiar el comportamiento de select(), puede establecer un tiempo de espera en la selección en Thread1 mediante la variable compartida. Thread2 puede modificar esta variable para actualizar el valor del tiempo de espera y Thread1 puede comprobar cualquier cambio en esta variable y actualizar el valor del tiempo de espera de select() en consecuencia.

    El fragmento de código anterior da un ejemplo de cómo se puede lograr esto. Thread1 está esperando en select() con un tiempo de espera NULL inicialmente mientras que Thread2 está estableciendo un valor de tiempo de espera de 5 segundos en la select(). Este código supone que Thread1 se ejecuta primero, por lo que select() comienza inicialmente sin tiempo de espera y el tiempo de espera se modifica posteriormente por Thread2 mientras Thread1 todavía está esperando en la select().

Comments are closed.