Frage

Dieser Befehl ist wirklich sehr nützlich, aber wo ich den Quellcode bekommen, um zu sehen, was im Innern vorgeht.

Dank.

War es hilfreich?

Lösung

Das Schwanz-Dienstprogramm ist Teil der coreutils auf Linux.

Ich habe immer gefunden, FreeBSD weit klarer Quellcode als das Gnu-Dienstprogramme zu haben. Also hier ist tail.c im FreeBSD-Projekt:

Andere Tipps

Poke um die uclinux Website. Da sie die Software verteilt, werden sie benötigt, um die Quelle zur Verfügung eine oder andere Weise zu machen.

Oder könnten Sie man fseek lesen und erraten, wie es getan werden könnte.

NB-- Siehe Williams Kommentare unten, gibt es Fälle, wenn Sie versuchen, nicht verwenden können.

Sie könnte es eine interessante Übung finden Sie Ihre eigenen zu schreiben. Die überwiegende Mehrheit der Unix-Kommandozeilen-Tool ist eine Seite oder so ziemlich einfach C-Code.

Um auf den Code anschauen, werden die GNU Coreutils Quellen gefunden leicht auf gnu.org oder Ihre Lieblings-Linux-Mirror-Site.

/`*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.*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top