Проблема создания дочернего процесса в Linux - PullRequest
3 голосов
/ 11 февраля 2010

Я использую ядро ​​Linux 2.6.30 на своей плате. Он имеет 128 МБ памяти DDR2. Мое основное приложение занимает почти 80 МБ системной памяти. После выполнения всех приложений остается только 25 МБ. Я хочу выполнить системные команды из моего основного приложения (которое использует 80 МБ). Но это не выполняется. Насколько я понимаю, каждый дочерний процесс требует той же памяти, что и родительский процесс (я получил это описание из руководства по функциям fork). Так что в моем случае новый дочерний процесс требует еще 80 МБ, что недоступно. Следовательно, системный вызов не работает. Системная команда должна выполняться сразу после выдачи команды, поскольку для выполнения следующих шагов в основном приложении требуется результат системной команды (например, необходимо сохранить выходные данные команды grep в файле и немедленно прочитать этот файл для дальнейшей обработки). Следовательно, я не могу использовать механизм IPC. Какие еще способы?

Саурабх Шах

Ответы [ 4 ]

1 голос
/ 11 февраля 2010

Если вы используете system(), то потребуется выполнить оболочку для анализа и выполнения вашей команды, и оболочка может быть большой. Если вы можете разделить строку на команду и аргументы самостоятельно, вы можете вызвать fork() и execve() напрямую, чтобы не нужно было загружать оболочку.

1 голос
/ 11 февраля 2010

Если у вас нет какой-то причудливой, поврежденной архитектуры ЦП или libc, он должен использовать Copy-on-Write с fork(), так что вы должны быть в порядке с exec() сразу после.

0 голосов
/ 16 февраля 2010

Сначала вы должны попробовать простую вилку и посмотреть, что получится. Я думаю, что столкнулся с подобной проблемой, когда серверу thttpd не хватает памяти без причины. Также очень полезным инструментом является strace.
ограничьте свой процесс, и вы сможете увидеть, какой системный вызов не работает, и предоставить дополнительную информацию людям здесь.

Кроме того, я не понимаю, почему IPC не является решением. Может быть более сложным, но все же решение. Например, вы можете использовать доменный сокет unix для получения двунаправленного канала.

0 голосов
/ 16 февраля 2010

Если по какой-то причине в вашей встроенной системе установлен glib, вы можете попытаться использовать их эквиваленты системных вызовов.

См: http://library.gnome.org/devel/glib/2.22/glib-Spawning-Processes.html

g_spawn_sync, в частности, кажется, делает то, что вам нужно.

К сожалению, вызов system () часто затрудняет получение хороших кодов ошибок. Я думаю, что стоило бы попробовать fork () и exec () (как предлагали другие авторы), чтобы посмотреть, вернут ли они вам более подробный код ошибки, и является ли это fork () или exec () (или что-то еще), который терпит неудачу.

Если вы сможете собрать эту дополнительную информацию, она может помочь другим в вашей отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...