2013-11-18 6 views
5

В разделе UNIX® System Threads Reference под заголовком «Потоковая безопасность» список функций «не гарантируется нитью безопасности во всех UNIX-системах». Функция scandir() отсутствует в этом списке, в то время как readdir() появляется в списке.Действительно ли скандир поистине безопасен?

Однако glibc source для scandir() явно, кажется, вызывает readdir(), а не потокобезопасный readdir_r(). Так был scandir() пропущен из списка по какой-то другой причине, или это потокобезопасно по какой-то причине мне не хватает?

+1

Более новая версия списка «не требуется для потокобезопасности» находится здесь: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01, но scandir все еще не указан. Было бы интересно сравнить источники BSD и SysV, если у вас есть время их отслеживать. Вероятно, сообщение об ошибке должно быть сделано на glibc. –

+1

Похоже, что glibc на самом деле реализует readdir() поточно-безопасным способом, поэтому, вероятно, отчета об ошибке не нужно делать. –

ответ

1

Похоже, что POSIX.1-2008 указывает, что scandir() является потокобезопасным, поскольку он является POSIX.1-2008 function, а не в списке функций, разрешенных к не-потоковому. Тем не менее, POSIX.1-2008 не исключает, что readdir() является потокобезопасным, а в случае glibc представляется, что readdir()source фактически является потокобезопасным, поскольку он не возвращает глобальный struct dirent, а возвращает glibc-defined член DIR, возвращенный в вызове opendir().

Таким образом, хотя номер scandir() glibc вызывает readdir(), он по-прежнему выглядит потокобезопасным.

1

Я думаю, этот список охватывает только функции POSIX. scandir(3) - это BSD/SVID и, возможно, здесь не указано. Новые, потокобезопасные функции, вероятно, находятся в центре внимания этого списка, но не перечисляют старые, небезопасные функции.

Смежные вопросы