Seer
написал 9 апреля 2005 года в 17:46 (2614 просмотра)
Ведет себя
неопределенно; открыл 3 темы в форуме, оставил 4 комментария на сайте.
Наткнулся на статью, в которой описан злобный хак, позволяющий в виндовсе предавать сокет другому процессу. http://www.codenet.ru/progr/visualc/thsock.php
Нет ли в линуксе подобных злобных хаков, чтоб передавать дескрипторы между процессами? :)
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Дескриптор можно передать как обычную численную переменную :)
Другой вопрос, что получится ли у другого процесса использовать этот дескриптор %)
Пробовал. Для него это просто циферка, не несущая никакого глубокого смысла. До меня не сразу дошло что не так :) Сейчас приходится когда надо передать дескриптор килять процесс и создавать его заново, чтоб дескриптор отнаследовался, но это не есть гуд
ну да, дескриптор — это циферка :)
Здесь 1 — это просто дескриптор.
Вот только сомневаюсь, что дескипторы общие для всех потоков.
Не общие. Единственный способ сделать дескриптор общим для нескольких процессов — сделать форк, тогда у сыновнего процесса будут все те же дескрипторы. Но это иногда очень неудобно. Поэтому меня и интересует какой-нибудь злобный хак, позволяющий это обойти.
В unix можно передать дескриптор другому процессу с помощью функции sendmsg.
Насколько я помню всю эту бодягу, файловый дескриптор — это индекс в таблице открытых файлов, которая ассоциирована с процессом. Дескрипторы 0, 1 и 2 (stdin, stdout и stderr) открываются для всех созданных процессов по умолчанию (хотя их можно закрыть потом), поэтому можно быть уверенным, что дескриптор 1 для всех процессов — это stdout (тоже не факт, если его dup’али). А так — дескриптор n для одного процесса и дескриптор n для другого могут относиться к разным файлам, поскольку находятся в разных таблицах.
С другой стороны, ядро держит свою собственную таблицу всех открытых фалов в системе. Если бы такой хак существовал, он выцарапывал бы «ядреный», т.е. ядровый файловый дескриптор. Но ядро, понятно, из своей памяти просто так ничего не отдаст. Разве что перехватить какой-нибудь системный вызов типа «open», но опять-таки, это означало бы впердоливание своего кода в ядро. А перехватывание системного вызова модулями было убрано из ядер 2.6…
Можно почитать The Phrack Magazine, наводит на мысли.
Good Luck,
UT
Мда. Тоскливо. А было б удомно…
>> Было бы удобно
Не вижу ничего удобного. В Unix есть очень мощные механизмы IPC, которые в Win32 и не снились, поэтому в винде есть куча хаков (т.е. нормально по человечески сделать ничего нельзя). Имхо, такие вопросы от того, что люди пытаются интерполировать свои знания Win32 в Unix (проще говоря — со своим уставом в чужой монастырь).
Show me the code!
Дескрипторы, конечно, для всех потоков (threads) — общие…
А вот для процессов — индивидуальные! :
Здесь сказали:
«Единственный способ сделать дескриптор общим для нескольких процессов»…
- и это, в общем, правильно, именно поэтому что «индивидуальные», … за исключением «единственный»: это (fork()) — наиболее частый способ, но существуют ещё десятки способов, начиная с IPC, и заканчивая… экзотикой, типа popen()…
…Вставлю и я свои 5 копеек
А теперь попробуйте запустить несколько копий одновременно :)
У каждого процесса своя ПОЛЬЗОВАТЕЛЬСКАЯ таблица дескрипторов файла, уникальная для каждого процесса, в которую заносятся получаемые нами дескрипторы. Сами эти дескрипторы ни что иное как ссылки на элементы ГЛОБАЛЬНОЙ ТАБЛИЦЫ ФАЙЛОВ, единой для всей системы. Так что если хотим добраться до дескрипторов «чужого» процесса, придется опускаться на уровень ядра, что не есть хорошо, хотя…
P.S.
Вообще эта кухня хорошо описана у Морриса Баха в «THE DESIGN OF THE UNIX OPERATING SYSTEM»
Безусловно: потоки выполняются в едином изолиованном адресном пространстве, а процессы — это индивидуальные изолированные адресные пространства. Между процессами вы можете передавать дескрипторы только пользуясь IPC механизмами. Но и передав дескриптор в другой процесс — вы не можете его просто так использовать: это просто численная переменная дескриптора… , хотя использовать потоки обмена, созданные другим процессом — можно, но требует некоторой изобретательности. Детальнее можно сказать — только зная содержание задачи.