2011-05-04 3 views
1

В моей программе на C++ я пытаюсь запустить программы в фоновом режиме, просто не дожидаясь их.В C++ не ожидание не означает бег в фоновом режиме?

Однако в Linux, если я запустил vi в фоновом режиме, например: vi &, тогда vi не отображается. В моей программе vi будет всплывать, даже если я не жду, пока он закончится.

Значит ли это, что я не выполняю его в фоновом режиме? Как это можно зафиксировать?

Кроме того, я заметил, что в Linux, если я набираю fg для переноса vi на передний план, появится vi. Как я могу сделать это в C++?

+1

Вы должны, вероятно, предоставить код, показывающий, как вы запускаете программу в фоновом режиме – Vusak

+0

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

+1

Запуск фона - это концепция ОС и не имеет ничего общего с C++ –

ответ

5

Что происходит здесь довольно сложно (для получения дополнительной информации, чем вы, вероятно, потребуется, см раздел руководства GLibC на job control), но короткая версия: Только план группового процесса может получить доступ к терминалу. Любой другой процесс автоматически получает ^Z, если он пытается получить доступ к терминалу.

Если вы переделаете процесс с C, если родительский элемент находится в группе процессов переднего плана, дочерний элемент также считается находящимся в группе процесса переднего плана, если это не изменит родительский или дочерний элемент. Когда вы делаете vi &, оболочка (которая является еще одной программой на C, помните) занимает vi из группы процессов переднего плана. Но вы этого не делаете, поэтому vi запускается немедленно.

Теперь вы хотите разветвить процесс из своей программы на языке C и обработать его так же, как если бы он был запущен с & из оболочки. Вы можете сделать только часть этого. Вы можете поместить его в группу процессов без переднего плана - см. Руководство по glibc для инструкций; как я уже сказал, это сложно, но вы не можете добавить его в список групп процессов, о которых знают команды управления работой оболочки. Этот список является внутренним по отношению к оболочке, и нет никакого способа получить его от другого процесса.