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