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.

¿Restaurar el contenido de un descriptor de archivo después de leerlo?

Para darte un poco de contexto, mi programa básicamente toma comandos y los concatena mediante tuberías, y almacena la cantidad de bytes de cada salida en un archivo.

Mi problema es que, aunque logré concatenar los procesos, en el momento en que leo la salida del primero (para almacenar los bytes en un archivo), el segundo proceso no puede leer la salida porque el descriptor de archivo ya fue utilizado.

¿Existe alguna forma de restaurar el descriptor de archivo antes de la lectura o hacer una copia de seguridad?

Aquí tienes un código de muestra en el padre. El objetivo de este código sería almacenar la salida en el archivo y restaurarla antes de leerla:

for (int i = 1; i < processes-1; i++) {
    close(apipe[i][1]);
    FILE *fp;
    fp = fopen("count", "a");

    char buffer[4096];
    int amount=0;

    int std_fd=dup(apipe[i][0]);
    int count;
    while (1) {
        count = read(std_fd, buffer, sizeof(buffer));
        amount+=count;
        if (count == -1) {
            if (errno == EINTR) {
                continue;
            } else {
                perror("read");
                exit(1);
            }
        } else if (count == 0) {
            break;
        } else {
            break;
        }
    }
    fprintf(fp, "%d : %d \n", i,amount);
    close(apipe[i][0]);
    if(i==1){
        close(apipe[0][0]);
        close(apipe[0][1]);
    }
    fclose(fp);
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para restaurar el descriptor de archivo antes de la lectura, puedes utilizar la función dup() para crear una copia del descriptor de archivo y usarlo para leer la salida mientras mantienes intacto el descriptor de archivo original para uso futuro.

    En el código proporcionado, la línea “int std_fd = dup(apipe[i][0]);” crea una copia del descriptor de archivo antes de la operación de lectura. Puedes utilizar esta copia para leer la salida mientras mantienes el descriptor de archivo original para uso futuro.

    Para hacer una copia de seguridad del archivo, puedes crear una copia del archivo antes de leer la salida y luego usar el archivo original para la lectura. De esta manera, si el archivo original se modifica durante la operación de lectura, siempre puedes consultar la copia de seguridad para obtener los datos originales.

    En general, el enfoque más adecuado dependerá de los requisitos específicos de tu programa y de cómo deseas manejar los datos de salida.

Comments are closed.