В C ++ не ждать не означает работать в фоновом режиме? - PullRequest
1 голос
/ 04 мая 2011

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

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

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

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

1 Ответ

5 голосов
/ 04 мая 2011

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

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

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

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