man scandir может быть и неплохо, но сам scandir - ужасен.
Поясню: Что делает скандир? Скандир аллоцирует массив и заполняет его
указателями на dirent'ы. После чего необходимо освобождать выделенную
память руками. Т.е. выделение памяти в одном месте, а освобождение -
в другом. Прямая дорога к бугам.
Далее. Предположим что мы используем потоки ( threads, not streams ).
scandir - не reentrant, и reentrant версии для него нетути. А вот
для readdir есть readdir_r. Документации по нему на Линуксе, конечно
же нет, но функция есть.