Подтвердить что ты не робот

WaitForSingleObject в дескрипторе файла?

Что происходит, когда вы вызываете WaitForSingleObject() в дескрипторе, созданном с помощью CreateFile() или _get_osfhandle()?

По причинам, которые не стоит объяснять, я хотел бы использовать WaitForSingleObject(), чтобы ждать HANDLE, которую я создал с помощью _get_osfhandle(fd), где fd поступает от обычного вызова до _open(). Возможно ли это?

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

На странице MSDN для WaitForSingleObject() говорится, что единственными поддерживаемыми вещами, которые он обрабатывает, являются "уведомления об изменениях, вход в консоль, события, уведомления о ресурсах памяти, мьютексы, процессы, семафоры, потоки и ожидаемые таймеры".

Кроме того, было бы иначе, если бы я использовал CreateFile() вместо _get_osfhandle() в дескрипторе файла CRT?

4b9b3361

Ответ 1

Не делай этого. Как вы можете видеть, оно имеет поведение undefined.

Даже когда поведение определено, оно определяется таким образом, чтобы быть относительно не полезным, если вам не нравится писать дополнительный код. Это сигнализируется, когда завершается любая операция асинхронного ввода-вывода на этом дескрипторе, которая не обобщает для отслеживания завершения операции ввода-вывода.

Почему вы пытаетесь дождаться дескриптора файла? Ясно, что намерение имеет значение, когда вы делаете что-то, что даже не поддерживается достаточно хорошо, чтобы не блокировать бесконечно.

Ответ 2

Я нашел следующие ссылки. Мне кажется, что это консенсус, не делайте этого.

Ожидание дескриптора файла

Когда операция ввода-вывода запускается на асинхронная ручка, ручка идет в состояние без сигнализации. Следовательно, при использовании в контексте WaitForSingleObject или WaitForMultipleObjects, дескриптор файла будет сигнализироваться, когда операция ввода-вывода завершается. Однако, Microsoft активно препятствует этому техника; он не обобщает, если существует более одного ожидающего ввода-вывода операция; ручка станет сигнализируется, если какая-либо операция ввода/вывода завершено. Поэтому, хотя это техника возможна, она не считается лучшей практикой.

Использовать ReadDirectoryChangesW в режим перекрытия. WaitForSingleObject может ждать события в OVERLAPPED struct.

Вы также можете использовать API WaitForSingleObject(), чтобы подождать изменение файла, если вы используете следующее функция уведомления об изменении:
FindFirstChangeNotification()
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/findfirstchangenotification.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp

Интересная заметка о "зле" ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx