Como posso obter o código-fonte para a cauda utilitário linux?
Pergunta
Este comando é realmente muito útil, mas onde eu posso obter o código-fonte para ver o que está acontecendo lá dentro.
obrigado.
Solução
O utilitário cauda é parte dos coreutils no Linux.
- Fonte arquivo tar: ftp://ftp.gnu.org/gnu /coreutils/coreutils-7.4.tar.gz arquivo
- Fonte: http: //git.savannah .gnu.org / IGC / coreutils.git / árvore / src / tail.c
Eu sempre achei FreeBSD para ter o código-fonte muito mais clara do que os utilitários GNU. Então tail.c está aqui no projeto FreeBSD:
Outras dicas
puxão em torno do local uclinux. Desde que distribuiu o software, eles são obrigados a fazer a fonte de uma maneira ou de outra disponível.
Ou, você poderia ler man fseek
e adivinhar como ele pode ser feito.
comentários NB-- See de William abaixo, há casos em que você não pode usar procuram.
Você pode achar que é um exercício interessante para escrever o seu próprio. A grande maioria das ferramentas de linha de comando Unix são uma página ou mais de código C bastante simples.
Para basta olhar para o código, as fontes GNU Coreutils são facilmente encontrados em gnu.org ou seu site favorito Linux espelho.
/`*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.*/