LINUX.ORG.RU

Получение дескриптора отрытого файла после exec


0

0

Как после fork и exec получить дескриптор файла(или сокета), открытого в процессе родителе. Т.е.

Proc1
(open(file1))
||
|| (fork)
\/
Proc2
||
|| (execl(cmd1,NULL)) пользовательский контекст другой
\/
Proc2_cmd1
write(file1)

Как получить file1 ?

P.S.
Вариант с /proc уже смотрел, но я думаю есть более простой способ

> Как после fork и exec получить дескриптор файла(или сокета), открытого в процессе родителе. Т.е.

Хммм... вопрос непонятен :-/ Что значит "получить дескриптор"?
Если у тебя в родительском процессе есть файл-дескриптор, то и
в дочернем процессе (в том числе после exec) его номер останется
точно таким же (если ты конечно не поставил FD_CLOEXEC).

HTH

Onanim
()

передай в командной строке

cvv ★★★★★
()
Ответ на: комментарий от Onanim

у меня этот текст не вызвал ассоциаций с кодом

cvv ★★★★★
()
Ответ на: комментарий от Onanim

2Onanim
Вопрос был в том как с минимальными усилиями передать в дочерний процесс после exec, дескриптор использовавшийся в родительском процессе.

Насчет кода - это скорее псевдокод чем реальный код, просто я так пытался яснее обрисовать картину.

2cvv
Наверное так и сделаю(передам в командной строке).

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

free_serj ★★
() автор топика
Ответ на: комментарий от free_serj

>Просто мне казалось что есть какой-то другой, унифицированный способ >передачи/получения дескриптора.

dup2 на фиксированный номер. Все равно дескрипторы с номерами выше 2 по-хорошему должны быть закрыты.

Murr ★★
()
Ответ на: комментарий от free_serj

Между родителем/потомком передавать дескрипторы не надо вообще - потомок их наследует. как тебе и написал Onanim. Если дочерний процесс не знает, _какой именно_ из унаследованных открытых дескрипторов использовать, тогда передавай через командную строку (так делает, например, fsck.ext3).

Стандартный способ передачи дескрипторов между (двумя любыми) процессами есть, использует UNIX sockets, man unix. Но это не то, что тебе нужно.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>>Между родителем/потомком передавать дескрипторы не надо вообще - >>потомок их наследует. как тебе и написал Onanim.

Я это понимаю. Но после exec теряеться пользовательский контекст родителя и соответственно номер дескриптора. Вопрос в том, как я уже писал выше как его передать.

free_serj ★★
() автор топика

итого:

а) передавать номер в командной строке

б) dup2 на константу

в) не передавать номер, передавать сам дескриптор через unix socket

г) открыть управляющий пайп перед форком, dup2 его read конца на stdin в чайлде, писать в пайп, читать со стдина - если он не занят для чего другого.

д) использовать какое-нибудь другое средство IPC (Sys5 message queue, anyone? ;-)

anonymous
()
Ответ на: комментарий от cvv

> под линуксом кажись номер 3 забит за управляющим терминалом. так просто не закрывается

Откуда ты это взял? Сам-то в это веришь? Проверял? Или лень?

Onanim
()
Ответ на: комментарий от Onanim

года два назад немного вникал:

bash-2.05b$ ls -l /proc/$$/fd
итого 0
lrwx------    1 cvv      bcs            64 Июл 20 13:39 0 -> /dev/pts/1
lrwx------    1 cvv      bcs            64 Июл 20 13:39 1 -> /dev/pts/1
lrwx------    1 cvv      bcs            64 Июл 20 13:39 2 -> /dev/pts/1
lrwx------    1 cvv      bcs            64 Июл 20 13:39 255 -> /dev/pts/1
lrwx------    1 cvv      bcs            64 Июл 20 13:39 3 -> /dev/tty
lrwx------    1 cvv      bcs            64 Июл 20 13:39 5 -> /dev/pts/1
l-wx------    1 cvv      bcs            64 Июл 20 13:39 7 -> pipe:[866235]
lrwx------    1 cvv      bcs            64 Июл 20 13:39 9 -> /dev/pts/0
bash-2.05b$

спорить не буду дело было давно и не правда. 

cvv ★★★★★
()
Ответ на: комментарий от anonymous

е) передавать через переменную окружения.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

>в) не передавать номер, передавать сам дескриптор через unix socket

Как можно передать дескриптор через socket ?

В разных процессах если они не родитель-потомок одно и 
то-же число (дескриптор), то что получаем от open() 
 будет указывать абсолютно на разные вещи.
Передавать структуру на которую указыкает "дескриптор"?
Или что ?

Это вопрос не больше.
Я интересовался раньше но так и не довел до конечного
результата. Если знаете, может по подробнее пожалуйста.

anonymous
()

после execl уже ни чего не сделаеш -- execl это `gosub without return' (c)

beastie ★★★★★
()
Ответ на: комментарий от anonymous

> Как можно передать дескриптор через socket ?

Подробно это разобрано у Стивенса в UNPv1 (есть русское издание).
Также описано в Linux Application Development, можешь посмотреть
на исходник http://www.danlj.org/lad/src/ (смотреть файл passfd.c)

HTH

Onanim
()
Ответ на: комментарий от Onanim

Спасибо, посмотрел, интересно.
А что это за русское издание Стивенса ?
Не помните название книжки ?

anonymous
()
Ответ на: комментарий от tailgunner

> Варианты в), г), д) - это разве что для повышения общей эрудиции.

безусловно.

> Я бы сделал a) или е).

Лично мне (а я автор поста со списком) е) нравится больше, в т.ч. и потому, что сам до него не додумался.

anonymous
()
Ответ на: комментарий от anonymous

> А что это за русское издание Стивенса ?

Стивенс, UNPv1 - http://www.books.ru/shop/books/82359
Стивенс, UNPv2 - http://www.books.ru/shop/books/23626

Это переводы второго издания. Перевод местами такс себе,
есть даже фактические ошибки. Но все равно рекомендую.

APUE Стивенса на русский вроде как не переводили.

HTH

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.