2012-05-20 2 views
5

Есть ли вообще в Linux (или, в общем, в ОС POSIX), чтобы гарантировать, что во время выполнения программы никакие дескрипторы файлов не будут повторно использоваться, даже если файл закрыт, а другой открыт? Я понимаю, что эта ситуация обычно приводит к тому, что дескриптор файла для закрытого файла переназначается вновь открытому файлу.Предотвращение повторного использования файловых дескрипторов

Я работаю над проектом трассировки ввода-вывода, и это упростит жизнь, если я могу предположить, что после вызова open()/fopen() все последующие операции ввода-вывода с этим файловым дескриптором относятся к тому же файл.

Я возьму либо решение для компиляции, либо время выполнения.

Если это невозможно, я могу сделать свой собственный учет при обработке файла трассировки (отмечая местоположение всех открытых и закрытых вызовов), но я предпочел бы выкачать проблему во время выполнения трассированной программы.

+0

Я думаю, вы должны взять второй подход (делая свой собственный учет). Изменение поведения присвоения дескриптора файла (которое строго указано POSIX) на что-то несоответствующее, будет прерывать программы тонким (и, возможно, опасным) способом. –

ответ

7

Обратите внимание, что POSIX requires:

Открытая функция () возвращает файловый дескриптор для указанного файла , что является самым низким файловый дескриптор не в настоящее время открыт для этого процесса.

Так что в строгом смысле ваш запрос изменит среду программы, чтобы она перестала соответствовать требованиям POSIX.

Это, скорее всего, будет использовать LD_PRELOAD trick для перехвата звонков на close и игнорировать их.

+0

Спасибо, хорошо найти подтверждение в спецификации POSIX для поведения, которое я наблюдал. – mhowison

1

Вам необходимо написать SO, содержащий close(2), который открывает /dev/null на старых FD, а затем используйте $LD_PRELOAD, чтобы загрузить его в пространство процесса перед запуском приложения.

+0

На самом деле, у меня уже есть вызов __wrap_close() для реализации процедур трассировки, поэтому кажется, что я мог просто вставить открытую («/ dev/null») внутри этой процедуры после вызова __real_close() на FD. Будет ли это всегда работать? То есть я гарантированно вернусь к тому же FD на открытом («/ dev/null») вызове, когда я закрыл вызов __real_close()? – mhowison

+1

№. Вот почему вы открываете один раз и используете 'dup2 (2)' для копирования FD. –

+0

'__wrap_close' * нигде * почти достаточно для отслеживания целей. Подумайте «syscall (SYS_open, ...)». –

1

Необходимо, чтобы приложение было перехватило операции открытия и закрытия файла.

Было бы тривиально предотвращать повторное использование FD путем «ввода» dup2(X, Y); close(X); вызовов в приложение и корректировки Y, чтобы быть чем угодно.

Однако применение сам может использовать dup2, чтобы заставить повторное использование ранее закрытых FD, и может не работать, если вы не допустить этого, так что я думаю, что вы будете просто иметь дело с этим в пост- обработка шаг.

Кроме того, довольно легко написать приложение, которое закончится из FD, если вы запретите повторное использование.

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