Wie kann ich den Quellcode für den Linux-Dienstprogramm Schwanz bekommen?
Frage
Dieser Befehl ist wirklich sehr nützlich, aber wo ich den Quellcode bekommen, um zu sehen, was im Innern vorgeht.
Dank.
Lösung
Das Schwanz-Dienstprogramm ist Teil der coreutils auf Linux.
- Quelle Tarball: ftp://ftp.gnu.org/gnu /coreutils/coreutils-7.4.tar.gz
- Die Quelldatei: http: //git.savannah .gnu.org / CGIT / coreutils.git / Baum / src / tail.c
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.*/