Pregunta

este comando es realmente muy útil, pero donde puedo obtener el código fuente para ver lo que sucede dentro.

gracias.

¿Fue útil?

Solución

La utilidad de cola es parte de los coreutils en Linux.

Siempre he encontrado que FreeBSD tiene un código fuente mucho más claro que las utilidades gnu. Así que aquí está tail.c en el proyecto FreeBSD:

Otros consejos

Mire alrededor del sitio uclinux. Dado que distribuyeron el software, están obligados a hacer que la fuente esté disponible de una forma u otra.

O bien, puede leer man fseek y adivinar cómo se puede hacer.

NB-- Vea los comentarios de William a continuación, hay casos en los que no puede usar el buscador.

Puede que le resulte un ejercicio interesante escribir el suyo propio. La gran mayoría de las herramientas de línea de comandos de Unix son una página más o menos de código C bastante sencillo.

Para ver el código, las fuentes de GNU CoreUtils se encuentran fácilmente en gnu.org o en su sitio espejo favorito de Linux.

/`*This example implements the option n of tail command.*/`

    #define _FILE_OFFSET_BITS 64
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <unistd.h>
    #include <getopt.h>

    #define BUFF_SIZE 4096

    FILE *openFile(const char *filePath)
    {
      FILE *file;
      file= fopen(filePath, "r");
      if(file == NULL)
      {
        fprintf(stderr,"Error opening file: %s\n",filePath);
        exit(errno);
      }
      return(file);
    }

    void printLine(FILE *file, off_t startline)
    {
      int fd;
      fd= fileno(file);
      int nread;
      char buffer[BUFF_SIZE];
      lseek(fd,(startline + 1),SEEK_SET);
      while((nread= read(fd,buffer,BUFF_SIZE)) > 0)
      {
        write(STDOUT_FILENO, buffer, nread);
      }
    }

    void walkFile(FILE *file, long nlines)
    {
      off_t fposition;
      fseek(file,0,SEEK_END);
      fposition= ftell(file);
      off_t index= fposition;
      off_t end= fposition;
      long countlines= 0;
      char cbyte;

      for(index; index >= 0; index --)
      {
        cbyte= fgetc(file);
        if (cbyte == '\n' && (end - index) > 1)
        {
          countlines ++;
          if(countlines == nlines)
          {
        break;
          }
         }
        fposition--;
        fseek(file,fposition,SEEK_SET);
      }
      printLine(file, fposition);
      fclose(file);
    }

    int main(int argc, char *argv[])
    {
      FILE *file;
      file= openFile(argv[2]);
      walkFile(file, atol(argv[1]));
      return 0;
    }

    /*Note: take in mind that i not wrote code to parse input options and arguments, neither code to check if the lines number argument is really a number.*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top