(C) Дескрипторы Windows и процесс создания

Я пытался понять идею наследования дескрипторов, а память приложения распределяется в Windows по сравнению с Unix.

Поскольку Windows не предоставляет fork() или что-то подобное на самом деле, я читал createprocess и handles.

Я до сих пор не могу понять, как новый процесс может читать дескрипторы, переданные им от родителей. Я просмотрел документы msdn, и кажется, что ReadFile - это ответ, но не уверен, как его читать.

То, что я пытаюсь сделать, это клиент/сервер с передачей сервера через сокет. Я использую Winsock1, поэтому WSAduplicate не вариант. Я читал, что сокеты нельзя передавать, но их можно дублировать. (http://tangentsoft.net/wskfaq/articles/passing-sockets.html)

Короче говоря, скажем, я передаю значение дескриптора (например, 0x0000070) в качестве аргумента командной строки, как мне преобразовать его в действительный дескриптор (т.е. сокет).

Ваше здоровье,

** Обновление Я знаю, что этот подход не идеален, и потоки — гораздо лучший способ решить эту проблему. Но от нас было явно запрошено создавать дочерние процессы вместо многопоточности.


person M.Alnashmi    schedule 11.09.2013    source источник


Ответы (2)


В зависимости от точной природы вашего приложения типичным дизайном является использование нескольких потоков внутри процесса. Затем такие элементы, как socket, можно хранить в глобальном масштабе или передавать адрес сокета, не беспокоясь о проблемах наследования.

Помните, что сервер обычно работает как отдельный процесс, и код сервера обычно сильно отличается от кода клиента.

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

person JackCColeman    schedule 11.09.2013
comment
обновил вопрос -> я не ищу лучший подход к обработке, я должен использовать fork и createprocess.. - person M.Alnashmi; 12.09.2013

Интегральное значение унаследованного дескриптора такое же, как и в родительском процессе. Итак, все, что вам нужно сделать, это преобразовать целое число в дескриптор:

HANDLE h = (HANDLE) handle_value;
person Harry Johnston    schedule 13.09.2013