Как вывести дочерний процесс, работающий в фоновом режиме, на передний план - PullRequest
2 голосов
/ 26 апреля 2011

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

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

Ответы [ 3 ]

4 голосов
/ 29 апреля 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)

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

4 голосов
/ 26 апреля 2011

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

1 голос
/ 26 апреля 2011

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

...