Estoy intentando escribir un programa que implemente un comando POSIX cat básico. Aunque he escrito el código y se comporta normalmente para el predeterminado (sin parámetros) STDIN, no funciona bien para otros. Puede alguien ayudarme con esto. Aquí está el código:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define BUFFSIZE 10240
#define MAX_FILES 127

int main(int argc, char *argv[])
{
    int n,t,i;
    char buf[BUFFSIZE];
    char *myargv[MAX_FILES];
    //aiparser(argv,myargv);
    if (argc == 1) {
        while(( n = read(STDIN_FILENO,buf,BUFFSIZE)) > 0) {
            if (write(STDOUT_FILENO, buf ,n ) != n) {
                perror("Write Error");
            }
        }
        if ( n < 0 ) {
            perror("Read Error");
        }
    }
    else {
        for ( i = 1; i < argc-1 ; i++) {
            if (strcmp(argv[i],"-") != 0 ) {
                t = open(argv[i],O_RDONLY);
            }
            else {
                t = STDIN_FILENO;
            }
            while(( n = read(t,buf,BUFFSIZE)) > 0) {
                if (write(STDOUT_FILENO, buf ,n ) != n) {
                    perror("Write Error");
                }
            }
            if ( n < 0 ) {
                perror("Read Error");
            }
            if (close(t) == -1) {
                perror("Closing Error");
            }
        }
        }   
    exit(0);
}
0
uyetch 15 nov. 2011 a las 06:15
4
Explique exactamente cómo se comporta en el caso "otros".
 – 
Matt Ball
15 nov. 2011 a las 06:18
¿"No funciona bien" es la altura de su nivel de detalle técnico?
 – 
Kerrek SB
15 nov. 2011 a las 06:18
Perdóname por mis detalles ingenuos, pero mientras se ejecuta el programa, simplemente existe. Creo que el bucle for debajo de la parte else nunca se ejecuta.
 – 
uyetch
15 nov. 2011 a las 06:21
2
A través de algunas declaraciones printf(3) para averiguar con certeza qué está sucediendo, a muchas personas les gusta que los depuradores lo averigüen, pero creo que printf(3) es una excelente ayuda para la depuración.
 – 
sarnold
15 nov. 2011 a las 06:25
1
Sin embargo, +1 para el ejemplo completo. Tenga en cuenta que le faltaba el encabezado <strng.h> para strcmp(3).
 – 
sarnold
15 nov. 2011 a las 06:27

1 respuesta

La mejor respuesta

El problema es este:

Yo

... lo que significaría que nunca ejecutarías el bucle si solo pasas un único argumento.

2
Christopher 15 nov. 2011 a las 07:01
Gracias, yo también lo descubrí. Aún así, gracias por tomarse el tiempo para leer mi código.
 – 
uyetch
15 nov. 2011 a las 06:37
Eres bienvenido. También debo señalar que haría el ciclo si pasara más de un nombre de archivo, es decir, si pasa dos nombres de archivo, obtendrá uno; tres nombres de archivo, obtendría dos, etc .; pero pasar un solo argumento daría como resultado ... nada.
 – 
Christopher
15 nov. 2011 a las 06:59
Probablemente también debería ignorar los casos en los que lectura y escritura devuelven -1 y errno es EAGAIN o EINTR. Simplemente continúe con el bucle. No creo que presione EAGAIN porque el archivo no se configurará como no bloqueante en este caso, pero la verificación no perjudicará.
 – 
EricS
15 nov. 2011 a las 09:09