¿Cómo puedo obtener el código fuente de la cola de la utilidad de Linux?
Pregunta
este comando es realmente muy útil, pero donde puedo obtener el código fuente para ver lo que sucede dentro.
gracias.
Solución
La utilidad de cola es parte de los coreutils en Linux.
- Fuente tarball: ftp://ftp.gnu.org/gnu /coreutils/coreutils-7.4.tar.gz
- Archivo de origen: http: //git.savannah .gnu.org / cgit / coreutils.git / tree / src / tail.c
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.*/