L’implémentation naïve de tail est de lire le fichier séquentiellement, depuis le début, en gardant dans un tampon circulaire les N dernières lignes lues. Quand on atteint la fin du fichier, on affiche le tampon. Il n’y a rien de mieux à faire quand les données proviennent d’un tuyau ou d’un fichier spécial qui n’implémente pas lseek. Si les données proviennent d’un fichier normal, il vaut mieux lire le fichier en partant de la fin: avec lseek, on lit les 4096 derniers caractères; on les balaye pour compter les retours à la ligne; s’il y en a au moins N, on affiche les N lignes correspondantes et on sort; sinon, on recommence en ajoutant les 4096 caractères précédents, etc.

Pour ajouter l’option -f, il suffit, une fois qu’on a affiché les N dernières lignes, de se positionner à la fin du fichier, et d’essayer de lire (par read) à partir de là. Si read réussit à lire quelque chose, on l’affiche aussitôt et on recommence. Si read renvoie 0, on attend un peu (sleep 1), et on recommence.