Я пытаюсь реализовать простую оболочку на языке C, и мне трудно реализовать управление заданиями.Все в Интернете кажется достаточно сложным, и я думаю, что некоторая простота всегда хороша.
Итак, позвольте мне спросить это ... После вызова fork () могу ли я обработать сигнал Ctrl-Z с помощью только 2 функций и только с pid?
Обратите внимание, что Ctrl-Z имеет смысл прежде всего для драйвера терминала.Это приводит к отправке SIGTSTP
в группу процессов переднего плана терминала, в которую был введен этот символ, то есть в группу процессов, которая управляет этим терминалом и имеет разрешение на чтение из него.По умолчанию это приводит к остановке процессов в этой группе, но это все.Вам не нужно ничего делать, чтобы достичь этого. *
Я хочу вызвать функцию ex put_background (pid_t pid), когда я нажимаю Ctrl-Z и выполняю процесс сpid = pid для запуска фона и, наконец, вызова другой функции ex put_foreground (pid_t pid), когда я пишу fg, и я хочу, чтобы процесс с pid = pid снова вышел на передний план.
По определению и дизайну,не более одной группы процессов может контролировать данный терминал в любой конкретный момент времени.Таким образом, чтобы переместить задний план на задний план, все, что вам нужно сделать, это переместить другой на передний план.Это может быть сама оболочка или какая-то другая работа под ее контролем.Библиотека tcsetpgrp()
выполняет это.Если это не сама оболочка, вы также можете отправить SIGCONT
в эту группу процессов в случае ее остановки.
Вам также необходим механизм для возобновления остановленной фоновой работы, но это просто: просто отправьтеэта группа процессов a SIGCONT
.
Итак, возможно ли это?Любая помощь приветствуется ... код больше, однако.
Конечно, вы могли бы написать одну функцию для перемещения задания на передний план и его возобновления, и одну для возобновления фонового задания.Единственная информация, которая нужна этим функциям о заданиях, над которыми они работают, это их идентификаторы группы процессов (которые совпадают с идентификаторами процессов их начальных процессов).
Но вам также необходимо вести некоторый учет текущего активногорабочих мест, и вам необходимо позаботиться о запуске новых рабочих мест, а также отслеживать текущие рабочие места, особенно приоритетные, чтобы иметь возможность соответствующим образом организовать все переходы.
GLIBCРуководство содержит целую главу по управлению заданиями , включая содержательный раздел, посвященный реализации оболочки управления заданиями.Это, вероятно, будет полезно для вас, даже если вы не пишете для системы на основе GLIBC.Необходимый код не так уж и сложен, но для его правильной работы требуется хорошее понимание довольно широкого спектра понятий.
* Но вы делаете необходимо убедиться, что ваша оболочка помещает команды, которые она запускает, в группы процессов, отличные от ее собственных, иначе Ctrl-Z также остановит ее.