nixp.ru v3.0

18 октября 2017,
среда,
05:11:16 MSK

DevOps с компанией «Флант»
Seer написал 9 апреля 2005 года в 17:46 (1272 просмотра) Ведет себя неопределенно; открыл 3 темы в форуме, оставил 4 комментария на сайте.

Наткнулся на статью, в которой описан злобный хак, позволяющий в виндовсе предавать сокет другому процессу. http://www.codenet.ru/progr/visualc/thsock.php

Нет ли в линуксе подобных злобных хаков, чтоб передавать дескрипторы между процессами? :)

Longobard

Дескриптор можно передать как обычную численную переменную :)

Другой вопрос, что получится ли у другого процесса использовать этот дескриптор %)

Seer

Пробовал. Для него это просто циферка, не несущая никакого глубокого смысла. До меня не сразу дошло что не так :) Сейчас приходится когда надо передать дескриптор килять процесс и создавать его заново, чтоб дескриптор отнаследовался, но это не есть гуд

Longobard

ну да, дескриптор — это циферка :)

longobard ~ # strace echo "123"
.....
write(1, "123\n", 4123
.....
longobard ~ #

Здесь 1 — это просто дескриптор.

Вот только сомневаюсь, что дескипторы общие для всех потоков.

Seer

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

metal

В unix можно передать дескриптор другому процессу с помощью функции sendmsg.

Uncle Theodore

Насколько я помню всю эту бодягу, файловый дескриптор — это индекс в таблице открытых файлов, которая ассоциирована с процессом. Дескрипторы 0, 1 и 2 (stdin, stdout и stderr) открываются для всех созданных процессов по умолчанию (хотя их можно закрыть потом), поэтому можно быть уверенным, что дескриптор 1 для всех процессов — это stdout (тоже не факт, если его dup’али). А так — дескриптор n для одного процесса и дескриптор n для другого могут относиться к разным файлам, поскольку находятся в разных таблицах.

С другой стороны, ядро держит свою собственную таблицу всех открытых фалов в системе. Если бы такой хак существовал, он выцарапывал бы «ядреный», т.е. ядровый файловый дескриптор. Но ядро, понятно, из своей памяти просто так ничего не отдаст. Разве что перехватить какой-нибудь системный вызов типа «open», но опять-таки, это означало бы впердоливание своего кода в ядро. А перехватывание системного вызова модулями было убрано из ядер 2.6…

Можно почитать The Phrack Magazine, наводит на мысли.

Good Luck,

UT

Seer

Мда. Тоскливо. А было б удомно…

anonymous

>> Было бы удобно

Не вижу ничего удобного. В Unix есть очень мощные механизмы IPC, которые в Win32 и не снились, поэтому в винде есть куча хаков (т.е. нормально по человечески сделать ничего нельзя). Имхо, такие вопросы от того, что люди пытаются интерполировать свои знания Win32 в Unix (проще говоря — со своим уставом в чужой монастырь).

decvar
т.е. нормально по человечески сделать ничего нельзя

Show me the code!

Olej
LONGOBARD
Вот только сомневаюсь, что дескипторы общие для всех потоков.

Дескрипторы, конечно, для всех потоков (threads) — общие…

А вот для процессов — индивидуальные! :

Здесь сказали:

«Единственный способ сделать дескриптор общим для нескольких процессов»…

- и это, в общем, правильно, именно поэтому что «индивидуальные», … за исключением «единственный»: это (fork()) — наиболее частый способ, но существуют ещё десятки способов, начиная с IPC, и заканчивая… экзотикой, типа popen()…

Yorik

…Вставлю и я свои 5 копеек

...
  int f[2]={0,0};
  int fd=pipe(f);
  printf("f[0]=%d\tf[1]=%d\n",f[0],f[1]);
  scanf("%d",&fd);
...

А теперь попробуйте запустить несколько копий одновременно :)

У каждого процесса своя ПОЛЬЗОВАТЕЛЬСКАЯ таблица дескрипторов файла, уникальная для каждого процесса, в которую заносятся получаемые нами дескрипторы. Сами эти дескрипторы ни что иное как ссылки на элементы ГЛОБАЛЬНОЙ ТАБЛИЦЫ ФАЙЛОВ, единой для всей системы. Так что если хотим добраться до дескрипторов «чужого» процесса, придется опускаться на уровень ядра, что не есть хорошо, хотя…

P.S.

Вообще эта кухня хорошо описана у Морриса Баха в «THE DESIGN OF THE UNIX OPERATING SYSTEM»

Olej
Olej
Дескрипторы, конечно, для всех потоков (threads) — общие…

А вот для процессов — индивидуальные! :

Безусловно: потоки выполняются в едином изолиованном адресном пространстве, а процессы — это индивидуальные изолированные адресные пространства. Между процессами вы можете передавать дескрипторы только пользуясь IPC механизмами. Но и передав дескриптор в другой процесс — вы не можете его просто так использовать: это просто численная переменная дескриптора… , хотя использовать потоки обмена, созданные другим процессом — можно, но требует некоторой изобретательности. Детальнее можно сказать — только зная содержание задачи.