LINUX.ORG.RU

Что еще можно применить вместо fork()?

 , , memfree,


6

3

Работаю в сфере встраиваемых решений. Есть ситуация, ошибочная, когда с помощью fork() невозможно запустить другую программу из приложения. Ситуация ошибочна потому, что приложение «съело» столько озу, что на fork() места не остается.

Что еще можно применить вместо fork()? Есть ли еще какие-нибудь идеи, мысли, методы запуска программ из программ?



Последнее исправление: beastie (всего исправлений: 1)

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

Спасибо. Вопрос был про 2в1: «между объектами одной программы и между объектами разных программ»
Все, что встречается (кроме libevent), это для обмена между программами.
Поэтому сейчас более интересует именно обмен сообщениями между объектами внутри программы.

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

carb_blog10, спасибо за развернутый ответ, постараюсь осмыслить за выходные.
Пока же самое полезное в вашем ответе:
- «мне не интересно готовое говно, ибо оно всегда говно», т.е. вам готовое не нравится, ок, принято.
- «в надежде, что кто-то её поймёт и найдёт тебе то, что ты хочешь? Нет. Всем насрать», - да, согласен, похоже так и есть.

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

«мне не интересно готовое говно, ибо оно всегда говно», т.е. вам готовое не нравится, ок, принято.

Мне не нравится не готовое, а когда готовое не имеет смысла. В некоторых случая даже если оно готовое - его надо юзать, но не в твоём.

«в надежде, что кто-то её поймёт и найдёт тебе то, что ты хочешь? Нет. Всем насрать», - да, согласен, похоже так и есть.

Почему вы все такие глупые, ты понимаешь, что есть разные подходы к решению задачи? Почему ты решил, что твой подход вменяем и кому-то нужен?

Это всё оопешное говно, которое тут не юзаются, ибо нахрен не нужно. Если тебе оно нужно - иди хотябы в кресты и не неси херни.

Если ты один хрен пишешь говно, то зачем это делать через жопу на сишке, если есть более вменяемые языки? Где говно ваять намного проще, а результат один хрен говно и не особо отличается.

Берёшь кресты и хреначишь. В чем проблема? Ладно, делфятинки вроде на линуксе нету, а кресты есть.

В сишку уже идут, когда хоть что-то понимают(хотябы могут ответить на вопрос «зачем юзать сишку?»), а не ваяют что-то на примитивном уровне недостудента.

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

В сишку уже идут, когда хоть что-то понимают(хотябы могут ответить на вопрос «зачем юзать сишку?»), а не ваяют что-то на примитивном уровне недостудента.

Забавно, что об этом говорит такое нулёвый петух, как ты.

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

Всем хорош пример с объектом «диспетчер терминалов»: http://www.eventhelix.com/RealtimeMantra/basics/object_oriented_programming_i...
Только упущен момент объединения таких объектов в единую программу. Собственно, поэтому, vcl и был приведен в пример - как конкретная реализация, а не потому что мне надо как в виндах...

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

Опуская всю вашу мишуру, я понял, что у вас нет для меня решения, либо вы всячески его скрываете, а это для меня бесполезно. Потому более к вам вопросов не имею.
И, как уже сообщал ранее, в предметную область Вас посвящать не буду.

Vic
() автор топика

Немного о другом, но тоже на тему потребления памяти и overcommit... есть известный трюк с ulimit -s: вставить вызов ulimit -s 1024 перед запуском «больших» служб (rsyslog, например, из-за дефолтного размера стека 8192К отъедает почти 30М, а после ulimit <7М).

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

Если ее еще можно выставить для служб через limits.conf - вообще круто. Стеки системных служб отъедают довольно ощутимую часть памяти.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Ограничение на размер стека надо править аккуратно, лучше всего с использованием каких-нить инструментов по замеру используемого стека приложением. А то оно (приложение) упадет в самый неподходящий и самый ответственный момент.

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

Ограничение на размер стека надо править аккуратно

В общем, да, но я очень сомневаюсь, что какому-то приложению на встроенной системе потребуется стек даже в 1М (тот же rsyslog тестировали со стеком 128K - всё нормально).

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

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

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

В стек помещаются не только адреса возврата из функций но и локальные переменные самих функций.

Правда штоле? %)

tailgunner ★★★★★
()
23 декабря 2014 г.
Ответ на: комментарий от Vic

Результат

Найти другой, штатный в linux, способ запуска, не удалось.

И fork() и clone() [sys_clone], сначала делают дубликат родительского процесса в ОЗУ (со всем содержимым), затем его замещают новым.

Поэтому, создана программа прослойка, launcher, минимального размера, которая сидит в ОЗУ и запускает процессы, по мере надобности остального комплекса программ. Остальные же программы, выдают этому launcher-у команды на запуск приложений и параметры запуска.

PS. Жалко, что подобную возможность не добавили в прародитель всех процессов пользовательского уровня, init, который имеет pid=1, или в состав функций самого ядра (ведь процесс init запускается без родителя ;) ).

На этом тема закрывается, всем спасибо!

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

поставил 1024K общесистемно, ребутнулся, разницы нет(небольшие отклонения в обе стороны), чяднт? x86_64

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

а при 512K gcc валится на сборке себя

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

поставил 1024K общесистемно, ребутнулся, разницы нет

Как поставил, разницу в чем ожидал, как смотрел?

чяднт? x86_64

Для начала - чего ты хочешь достичь?

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

в /proc/*/limits видно, что применилось

но я уже вижу, что речь шла про virt. я думал про rss

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