Question

cette commande est vraiment très utile mais je peux obtenir le code source pour voir ce qui se passe à l'intérieur.

merci.

Était-ce utile?

La solution

L'utilitaire tail fait partie de coreutils sur linux.

J'ai toujours trouvé que FreeBSD avait un code source beaucoup plus clair que les utilitaires gnu. Alors, voici tail.c dans le projet FreeBSD:

Autres conseils

Poke autour du site uclinux. Depuis qu'ils ont distribué le logiciel, ils doivent rendre la source disponible d'une manière ou d'une autre.

Vous pouvez également lire man fseek et deviner comment procéder.

NB-- Voir les commentaires de William ci-dessous, il y a des cas où vous ne pouvez pas utiliser la recherche.

Vous trouverez peut-être un exercice intéressant d’écrire le vôtre. La grande majorité des outils de ligne de commande Unix sont une page ou plus de code C assez simple.

Il suffit de regarder le code pour trouver facilement les sources de GNU CoreUtils sur gnu.org ou sur votre site miroir Linux préféré.

/`*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.*/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top