LINUX.ORG.RU

Передача переменых Child-процессу


0

0

Привет!

у меня такой вопрос, я пишу прогу которая форкается и новый процесс меняет контекст через execlp(). В момент форка новый процесс имеет доступ к определенному struct-у но после execlp() все переменые теряются.

Есть ли какой нибуть *легкий* вариант, чтобы child-процесс всеже сохранял этот struct в своем конкесте/памяти даже после execlp() ?

Если это не возможно, то какой вид IPC (shared mem либо pipe) более приемлем для передачи этого structa по отношению к скорости выполенения. (Родительский процесс должен иметь минимальные задержки при передачи даных child-процессу, так как он обслуживает удаленых клиентов через select() )

Есть идеи?


очевидно, одну структуру надо "расшаривать" через IPC shm, а если поток структур - удобнее pipe

быстрее, конечно, будет работать shm - там вообще будет использоваться одна и та же память, передаваться будет только указатель/дескриптор

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

ну и процесс, запущенный через execl, должен "подцепить" память shm, т.е. там должен быть соотв. участок кода

theserg ★★★
()

Бредятина какая-то. Убери execlp, делай всё что надо сразу после fork(). Еще лучше --- prefork, а если совсем туго, то prefork + thread pool в каждом потомке. На крайняк, можно обойтись thread pool в единственном родительском процессе, если не требуется привилегии понижать.

execlp сожрет у тебя больше, чем все shmem и pipe вместе взятые.

watashiwa_daredeska ★★★★
()

Еще вариант для коллекции. Сериализовать данные в строку и передать ее как параметр exec.

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

Спасибо, я так и думал - попробую shm (структура одна)

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

Про этот вариант я уже тоже думал, но видимо перекодировать все поля структуры будет сложнее чем сделать расшареную память

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

а ты вооще прочитал внимательно мой вопрос? Помоему бредятину несешь ты. execlp необходим, так как вызывает внешнию программу, которой требуется структура/даные из родительского процесса. Treadы вооще оффтоп потому что вся программа уже написана и базируется на процессах. При чем тут prefork не понял - обьясни.

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

> execlp необходим, так как вызывает внешнию программу, которой
> требуется структура/даные из родительского процесса

Раз у тебя есть возможность выбирать способ передачи данных, я делаю
вывод, что вторая программа тоже под твоим (вашим) контролем, значит
есть возможность сделать хотя бы так (раз программа уже написана):

#include "second_prg_main.h"
...
if( (pid = fork()) == 0 )
{
  /* prepare args, pipes, close unneeded fds etc. */
  exit( second_main( argc, argv, env ) );
}
...

Соответственно, избавляемся от exec*. Если, конечно, дочерняя программа написана тоже на C/C++, на что похоже, раз есть вариант с использованием shmem (иначе это будет геморрой a la сериализация в поток).

> Treadы вооще оффтоп потому что вся программа уже написана и базируется на процессах.

Ну, оффтоп, так оффтоп. Я не настаиваю.

> При чем тут prefork не понял - обьясни.

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

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