Linux - Uso Optimo de fifo's

 
Vista:

Uso Optimo de fifo's

Publicado por Hector (3 intervenciones) el 02/07/2001 05:51:44
Hola , voy a tratar de ser lo mas explicativo posible , el objetivo que tengo es el
siguiente :

abro un fifo previamente creado con mkfifo y lo leo constantemente para reproducir
los datos que le van lleganda a travez del arvhivo a pantalla , el proglema es que una
vez que recive el primer caracter cada vuelta que pega recive un -1 desde el file
o desde el fgetc mejor dicho , con lo que el uso de la CPU se va para el 90 % , sin
embargo el programa funciona correctamente reproduciendo por pantalla lo que recive
del fifo , pero el rendimiento es inaceptable , me preguntaba si hay alguna forma
de que una vez que recive los primeros datos no se quede constantemente leyendo el -1
que le entra del fifo o de la fucion fgetc mas especificamente lo que me hace que cada
vuelta pege una lectura llevandome al rendimiendo pa el carajo.

Pasteo el pedazo que codigo que maneja esto a ver si se les ocurre alguna idea
( tenia pensado hacerlo con SELECT como con sockets pero no se si eso sirve para archivos
ni tampoco la manera de implementarlo en este caso ya que las pruebas que hize no
andubieron)

Codigo :

(archivo inin previamente creado con mkfifo inin)

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
FILE *fd;
char entrada;
fd=fopen("inin","r");
while(1) {
entrada=fgetc(fd);
if(entrada!=-1){printf("%c",entrada);}
}
return 0;
}

cuendo esta corriendo por primera vez no consume recursos, pero luego del
primer echo "hola" > inin , muestra en pantalla el hola y el cpu se va al 90 %
dado que luego el fgetc siempre toma un valor (-1).

Espero que alguien haya pasado ya por esto y me pueda dar una mano.

Saludos y Gracias por adelantado !

Hector.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problema de rendimiento con lectura de FIFO y fgetc

Publicado por Alejandro (176 intervenciones) el 05/12/2023 20:35:18
¡Hola, Héctor!

Entiendo el problema que estás experimentando. La razón por la que tu programa consume muchos recursos es porque el `fgetc` se bloquea esperando más datos en el FIFO. Cuando no hay datos, devuelve `-1`, pero esto ocurre repetidamente, causando un ciclo de lecturas continuas.

Una solución común para evitar este problema es cerrar y volver a abrir el FIFO después de cada lectura. Aquí tienes una modificación en tu código que podría ayudar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdlib.h>
#include <stdio.h>
 
int main(void)
{
    FILE *fd;
    char entrada;
 
    while (1) {
        fd = fopen("inin", "r");
        if (fd == NULL) {
            perror("Error al abrir el FIFO");
            return 1;
        }
 
        entrada = fgetc(fd);
        while (entrada != -1) {
            printf("%c", entrada);
            entrada = fgetc(fd);
        }
 
        fclose(fd);
    }
 
    return 0;
}

Con esta modificación, el programa abre y cierra el FIFO en cada iteración del bucle principal, evitando que el `fgetc` quede bloqueado con el valor `-1`.

Espero que esto resuelva tu problema y mejore el rendimiento de tu programa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar