Domanda

questo comando è davvero molto utile ma dove posso trovare il codice sorgente per vedere cosa sta succedendo all'interno.

grazie.

È stato utile?

Soluzione

L'utilità di coda fa parte dei coreutils su Linux.

Ho sempre trovato che FreeBSD aveva un codice sorgente molto più chiaro delle utility gnu. Quindi ecco tail.c nel progetto FreeBSD:

Altri suggerimenti

Poke intorno al sito uclinux. Poiché hanno distribuito il software, sono tenuti a rendere disponibile la fonte in un modo o nell'altro.

Oppure, potresti leggere man fseek e indovinare come potrebbe essere fatto.

NB-- Vedi i commenti di William qui sotto, ci sono casi in cui non puoi usare seek.

Potresti trovare un esercizio interessante per scrivere il tuo. La stragrande maggioranza degli strumenti da riga di comando Unix è una pagina di codice C abbastanza semplice.

Per dare un'occhiata al codice, i sorgenti GNU CoreUtils sono facilmente reperibili su gnu.org o sul tuo sito mirror Linux preferito.

/`*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.*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top