este comando es realmente muy útil, pero donde puedo obtener el código fuente para ver qué está pasando dentro.¿Cómo puedo obtener el código fuente para la cola de la utilidad de Linux?
gracias.
este comando es realmente muy útil, pero donde puedo obtener el código fuente para ver qué está pasando dentro.¿Cómo puedo obtener el código fuente para la cola de la utilidad de Linux?
gracias.
La utilidad tail es parte de coreutils en linux.
Siempre he encontrado que FreeBSD tiene código fuente mucho más claro que las utilidades GNU. Así que aquí está tail.c en el proyecto FreeBSD:
Busque en el sitio uclinux. Dado que distribuyeron el software, están obligados a poner la fuente a disposición de una forma u otra.
O bien, podría leer man fseek
y adivinar cómo se podría hacer.
NB-- Consulte los comentarios de William a continuación, hay casos en los que no puede usar seek.
cola no utiliza fseek. Si lo hiciera, no funcionaría en una secuencia (por ejemplo, 'grep pat file | tail') –
Hmm, nunca pensé en eso. Gracias. Tengo que pensar que aún sería más rápido cuando se trabaja con entradas buscables. – dmckee
Esto no es exactamente cierto. 'tail' does not * always * use seek ;-) –
le puede resultar un ejercicio interesante para 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.
Escribí un conjunto bastante completo de herramientas para MS-DOS cuando Linux estaba en su infancia. Y si bien muchos son ciertamente sencillos, dudaría en decir "una página" y no diría una "gran mayoría". ** encontrar ** y ** ls ** por ejemplo, fueron considerablemente más complejos. – NVRAM
El núcleo de la mayoría de las herramientas en general * es * corto. Pero el procesamiento de argumentos y el manejo de casos en las esquinas pueden ser molestos. – dmckee
Sí, probablemente debería haber dicho que "muchas" herramientas son cortas y simples. La cola de GNU tiene muchas opciones, entonces probablemente no encaja en la categoría "simple." La versión de cola que la mayoría de la gente usaría (es decir, el archivo cola -xxx o el archivo tail -f) sería bastante simple. –
/`*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.*/
+1 por diversidad, aunque la pregunta original era sobre la utilidad linux. –
Me gusta cómo la versión de Linux es varias veces más larga que la versión BSD. –
La versión de BSD es más corta porque las funciones que hacen todo el trabajo no están en ese archivo. es decir: follow(). –