Что я могу предположить о pthread_create и файловых дескрипторах? - PullRequest
0 голосов
/ 28 июня 2018

Я только что отладил программу, которая сделала примерно:

pthread_create(...);
close(0);
int t = open("/named_pipe");
assert(t == 0);

Иногда происходит сбой, поскольку pthread_create на самом деле кратко открывает файловые дескрипторы в новом потоке - в частности, /sys/devices/system/cpu/online - что, если вам не повезло, происходит между close и open выше, что делает t чем-то другим чем 0.

Какой самый безопасный способ сделать это? Что, если что-либо гарантировано о pthread_create относительно файловых дескрипторов? Я гарантированно, что если перед вызовом pthread_create открыто 3 файловых дескриптора, то при возврате и передаче моей функции в новом потоке будет также 3 открытых?

1 Ответ

0 голосов
/ 28 июня 2018

В многопоточных программах вам нужно использовать dup2 или dup3 для замены файловых дескрипторов. Старый трюк с немедленным повторным использованием после close больше не работает, потому что другие потоки и файловые дескрипторы создают в любое время. Такие файловые дескрипторы могут даже неявно создаваться (и закрываться) с помощью glibc, потому что многие интерфейсы ядра используют файловые дескрипторы.

dup2 - стандартный интерфейс. В Linux также есть dup3, с помощью которого вы можете атомарно создать дескриптор файла с установленным флагом O_CLOEXEC. В противном случае все равно было бы условие гонки, и дескриптор мог бы просочиться в подпроцесс, если процесс когда-либо разветвляется и выполняет новую программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...