Сначала немного справочной информации - почему цикл не работает под Windows:
В Linux дескрипторы имеют номера 0...n. Дескрипторы, переданные в «close()» и подобные функции, напрямую передаются в операционную систему:
void close(int handle)
{
syscall(SYS_CLOSE,handle);
}
Однако в Windows операционная система использует свои собственные дескрипторы, похожие на адреса указателей, а библиотека C использует своего рода таблицу перевода:
void close(int handle)
{
CloseHandle(table[handle]);
table[handle]=NULL;
}
Если дескрипторы остаются открытыми, библиотека C не знает (не STDIN, STDOUT, STDERR), что этих дескрипторов не будет в таблице.
Теперь о самом вопросе:
В отличие от Linux, Windows смешивает разные типы дескрипторов (дескрипторы файлов, дескрипторы памяти, дескрипторы процессов и т. д.). Если бы вы могли получить список всех дескрипторов, вам пришлось бы относиться к ним по-другому.
Другой момент заключается в том, что библиотеки Windows используют некоторые дескрипторы внутри. Если вы просто закроете все дескрипторы, унаследованные родительским процессом, вы рискуете сбоем вашей программы, поскольку библиотеки Windows могут зависеть от некоторых из этих дескрипторов.
Таким образом, родительское приложение, безусловно, должно гарантировать, что никакие дескрипторы не останутся открытыми. По умолчанию дескрипторы не наследуются в Windows. Однако оболочки библиотеки C (например, «fopen()») будут устанавливать флаг «наследовать дескриптор», поэтому дескрипторы будут унаследованы.
person
Martin Rosenau
schedule
13.09.2013
close()
? - person alk   schedule 12.09.2013for(int i=0, i< 0xffffffff; ++i) CloseHandle(i);
на окнах?! :-/ - person alk   schedule 12.09.2013NOINHERIT
, поэтому просто происходит наследование. Это нормальная практика для Unix-программ, и MinGW делает то же самое. Проблема в том, что трюк Unix не исправляет это в MinGW. - person ams   schedule 12.09.2013bInheritHandles
дляCreateProcess
. - person josh poley   schedule 12.09.2013_spawnl
, поэтому нет способа остановить наследование. Он не может использоватьCreateProcess
, потому что смешивание API приводит к плохим вещам (хотя иногда это работает). - person ams   schedule 12.09.2013