Pregunta

Abro un archivo FIFO como ifstream. Tan pronto como se crea el objeto, el hilo se bloquea hasta que envíe algo al FIFO (lo cual está bien para mí). Luego llamo a getline() para obtener los datos de la transmisión.

¿Cómo vuelvo a leer-bloquear el hilo hasta que se escriben más datos en el archivo FIFO?

Gracias

¿Fue útil?

Solución

No he probado este código, pero me pregunto si FIFO simplemente está configurando el bit EOF cuando lee todos los datos disponibles. En ese caso, puede hacer esto:

std::ifstream fifo;
std::string   line;
bool          done = false;

/* code to open your FIFO */

while (!done)
{
    while (std::getline(fifo, line))
    {
        /* do stuff with line */
    }
    if (fifo.eof())
    {
        fifo.clear();  // Clear the EOF bit to enable further reading
    }
    else
    {
        done = true;
    }
}

Si lee el final de la FIFO, reinicie y espere más datos. Si ocurrió un error, ya está. Se me ocurrió la idea de este sitio web . Es posible que también deba cerrar y volver a abrir el FIFO en el mismo bloque donde realiza el restablecimiento.

Otros consejos

La función getline proporcionada por <string> devuelve una referencia al objeto de flujo. Puede probar este objeto para & Quot; bondad & Quot; para ver si todavía está abierto o si se ha producido un error:

std::ifstream fifo;
std::string   line;

/* code to open your FIFO */

while (std::getline(fifo, line))
{
    /* do stuff with line */
}

Cuando se cierra el FIFO, la prueba while devolverá falso para salir del bucle. Cada iteración de bucle efectivamente bloqueará el hilo hasta que haya más datos listos.

Uso la secuencia de la siguiente manera:

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);

string CmdLine;

while (std::getline(_FifoInStream, CmdLine)) {
    cout << CmdLine << endl;
}

Estoy bloqueado solo cuando inicializo la variable _FifoInStream, es decir, abro la transmisión. Después de enviar datos a FIFO, caigo en el bloque while. Lo que necesito es leer de FIFO indefinidamente cada vez que se bloquea en lectura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top