Para agregar a la respuesta, en el libro El lenguaje de programación C (K&RC) han dado un pequeño ejemplo sobre cómo implementar ls. Han explicado muy bien las estructuras de datos y las funciones utilizadas.
Para comprender lo que hace ls, puede echar un vistazo a la fuente de OpenSolaris:https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.
Si eso es abrumador, en Solaris comienza usando truss para ver las llamadas al sistema que hace ls para entender lo que hace. Usando truss, intente:
truss -afl -o ls.out /bin/ls
luego mire la salida en ls.out
Creo que trace es el equivalente a truss en Linux.
ls no bifurca. El shell se bifurca y se ejecuta para ejecutar cualquier comando que no esté integrado, y uno de los comandos que puede ejecutar es ls.
ls usa opendir() y readdir() para recorrer todos los archivos en el directorio. Si necesita más información sobre uno de ellos, llama a stat().