Является ли дочерний процесс на переднем плане или фон на форк в C

Когда я выполняю fork() в C на LinuxЯвляется ли вновь созданный дочерний процесс передним планом или фоновым процессом?

Если это по умолчанию передний план, есть ли способ заставить его быть создан как фоновый процесс?

Я прочитал довольно много ссылок о fork, но не указано ли это на переднем плане или на заднем плане.

http://en.wikipedia.org/wiki/Fork_(system_call)

http://linux.die.net/man/2/fork

http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html

3 ответа

Просто установите последовательность в качестве фона или переднего плана, используя команды, которые я подробно описал ниже. Используйте pid = fork(), чтобы убедиться, что вы выполняете в родительском или дочернем элементе, в зависимости от того, что вы хотите установить первым. У родителя pid будет PID ребенка, а у ребенка - 0. Используйте его так:

if(pid)
// Parent
else
// Child

Процесс

Pid процесса помещается в pgid группы процессов

setpgid(pid, pgid);

Если pgid == pid или pgid == 0, то это создает новую группу процессов с pid лидера группы процессов. В противном случае это помещает pid в уже существующую группу процессов pgid. Нулевой индекс относится к текущему процессу. Вызов setpgrp() эквивалентен setpgid(0,0).

передний план

Среди групп процессов в сеансе не более одной может быть передняя группа процессов этого сеанса. Входные сигналы tty и tty (сигналы, генерируемые ^C, ^Z и т. Д.) Поступают в процессы в этой группе процессов переднего плана.

Процесс может определить группу процессов переднего плана в своем сеансе, используя tcgetpgrp(fd), где fd ссылается на свой tty. Если его нет, возвращается случайное значение больше 1, которое не является идентификатором группы процессов.

Процесс может установить группу процессов переднего плана в своем сеансе, используя tcsetpgrp(fd,pgrp), где fd ссылается на свой контролируемый tty, а pgrp - это группа процессов в своем сеансе, и этот сеанс по-прежнему связан с управляющим tty вызывающий процесс.

Как получить ФД? По определению, /dev/tty относится к управляющему tty, полностью независимому от перенаправлений стандартного ввода и вывода. (Существует также функция ctermid() для получения имени управляющего терминала. В стандартной системе POSIX он вернет /dev/tty.) Открытие имени управляющего tty дает дескриптор файла fd.

Фон

Все группы процессов в сеансе, которые не являются приоритетными, являются группами фоновых процессов. Поскольку пользователь на клавиатуре взаимодействует с процессами переднего плана, фоновые процессы должны держаться подальше от него. Когда фоновый процесс читает с терминала, он получает сигнал SIGTTIN. Обычно, это останавливает это, оболочка управления заданиями замечает и сообщает пользователю, который может сказать fg, чтобы продолжить этот фоновый процесс как процесс переднего плана, а затем этот процесс может читать с терминала. Но если фоновый процесс игнорирует или блокирует сигнал SIGTTIN, или если его группа процессов является потерянной (см. Ниже), тогда read() возвращает ошибку EIO, и сигнал не отправляется. (Действительно, идея состоит в том, чтобы сообщить процессу, что чтение с терминала прямо сейчас не разрешено. Если он не увидит сигнал, то он увидит возврат ошибки.)

Когда фоновый процесс пишет в терминал, он может получить сигнал SIGTTOU. Может: а именно, когда установлен флаг, что это должно произойти (по умолчанию он выключен). Можно установить флаг

% stty tostop

и очистить его снова

% stty -tostop

и осмотреть его

% stty -a

В Linux и многих Unix-подобных системах вы можете использовать daemon(3) для создания фонового, демонизированного процесса.

Вы также можете закрыть (2) или перенаправить все stdin, stdout, stderr (возможно, /dev/nullсм. null (4)), используя dup2 (2).

В противном случае позаботьтесь об управлении терминалами, группами процессов, управлением заданиями, идентификаторами сеансов. Смотрите setpgrp (2)setpgid) и раздел ПРИМЕЧАНИЯ. Используйте tcsetpgrp (3), setsid (2)

Читайте также tty демистифицированную страницу && tty (4)

Вы пытаетесь изменить хорошее значение в коде? Всякий раз, когда вы разветвляете процесс, он находится в "фоне". В зависимости от того, что вы имеете в виду, и что вы пытаетесь сделать.

Другие вопросы по тегам