То, что здесь происходит, довольно сложно (более подробную информацию, чем вы, вероятно, требуете, см. В разделе руководства glibc по управление заданиями ), но короткая версия: только группа процессов переднего плана может получить доступ к терминалу.Любой другой процесс автоматически ^ Z редактируется ядром, если он пытается получить доступ к терминалу.
Когда вы разветвляете процесс из C, если родительский элемент находится в группе процессов переднего плана,child также считается входящим в группу процессов переднего плана, если только родитель или дочерний процесс не изменят это.Когда вы делаете vi &
, оболочка (помните, что это просто еще одна C-программа) выводит vi
из группы процессов переднего плана.Но вы этого не делаете, поэтому vi
запускается немедленно.
Теперь вы хотите разветвить процесс из вашей C-программы и обработать его так же, как если бы он был запущен с &
из скорлупыВы можете сделать только часть этого.Вы можете поместить его в группу процессов не переднего плана - инструкции смотрите в руководстве по glibc;как я уже сказал, это сложно - но вы не можете добавить его в список групп процессов, о которых знают команды управления заданиями оболочки.Этот список является внутренним по отношению к оболочке, его невозможно получить из другого процесса.