Как вывести дочерний процесс, работающий в фоновом режиме, на передний план

Если бы я использовал fork() и execv() для создания нескольких дочерних процессов, работающих в фоновом режиме, и хотел бы вывести один из них на передний план, как бы я это сделал?

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


person node ninja    schedule 26.04.2011    source источник


Ответы (3)


Термины «фон» и «передний план» не используются в общем для процессов, а применяются только к оболочкам, которые могут ожидать выполнения заданий по требованию.

person Ignacio Vazquez-Abrams    schedule 26.04.2011
comment
+1 это правильно. Процесс переднего плана — это процесс, который получает stdin и записывает stdout/stderr. Сама ОС не имеет понятия об этом. - person Borealid; 26.04.2011
comment
Получение стандартного ввода. Даже фоновые процессы могут писать в stdout и stderr. - person Ignacio Vazquez-Abrams; 26.04.2011
comment
Стоит добавить, что если исходный постер означал, что им нужно, чтобы родитель прекратил что-либо делать, пока конкретный ребенок не закончит, им просто нужно waitpid(2) для этого. - person Jan Hudec; 26.04.2011
comment
Ответ интересный, но не помогает ОП. - person Matt Joiner; 27.04.2011
comment
@Matt: Если ОП не описывает, как они переводят процессы в фоновый режим, ничем помочь нельзя. - person Ignacio Vazquez-Abrams; 27.04.2011
comment
Я уже объяснил как. Я использую fork, а в дочернем процессе я использую execv для запуска процесса. - person node ninja; 28.04.2011
comment
За исключением того, что это не переводит процесс в фоновый режим. - person Ignacio Vazquez-Abrams; 28.04.2011
comment
После того, как я создаю процесс, я не жду его. Обычно родительский процесс ожидает завершения дочернего процесса. Это называется бегом на переднем плане. Если не ждать — это не то же самое, что работать в фоновом режиме, то что это значит? - person node ninja; 30.04.2011
comment
Это значит, что родитель не ждет. Дочерний процесс все еще работает и подключен к тому же стандартному вводу, стандартному выводу и стандартному выводу. - person Ignacio Vazquez-Abrams; 30.04.2011
comment
... Итак, вы говорите, что хотите, чтобы родитель контролировал доступ ребенка к стандартному вводу? - person Ignacio Vazquez-Abrams; 01.05.2011

Бесплатно Ответ Игнасио Васкес-Абрама, я предлагаю вам эмулировать модель переднего плана/фона оболочки.

Насколько я могу судить, фоновый процесс означает его приостановку. Проще всего это сделать через SIGSTOP. Когда вы активизируете процесс, отправьте его SIGCONT. Пока только одно из ваших «заданий» в настоящее время находится на переднем плане, оно будет единственным, которое читает и записывает в tty сеанса.

kill(child_pid, SIGSTOP);
kill(child_pid, SIGCONT);

Вы можете захотеть приостановить каждый процесс после того, как вы fork, и до того, как вы execv, и дать пользователю вашей оболочки возможность перевести их на передний план позже, чтобы сохранить инвариант.

if (!fork()) { // we are the child
    raise(SIGSTOP); // suspend self
    execv(...); // run the command (after we've been resumed)

Вот некоторые связанные ссылки, которые я нашел:

person Matt Joiner    schedule 29.04.2011
comment
Я не думаю, что запуск программы в фоновом режиме означает ее приостановку. Это означает, что пока программа работает, родитель работает. - person node ninja; 30.04.2011
comment
Когда речь идет о программах (процессах), понятия «передний план» или «фон» не существует. Это концепция оболочки. Подробнее об этом см. Ответ Игнасио Васкес-Абрамса. - person Matt Joiner; 30.04.2011

вы можете использовать fg, чтобы вывести процесс на передний план, и bg, чтобы перевести процесс в фоновый режим. вы должны знать pid процесса, чтобы вывести его на передний план. обратитесь к руководству Linux по fg и bg для получения дополнительной информации.

person swd    schedule 26.04.2011