Реализация подобного оболочке управления работой в C - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь реализовать простую оболочку на языке Си, и мне трудно реализовать управление заданиями.Все в Интернете кажется достаточно сложным, и я думаю, что некоторая простота всегда хороша.Итак, позвольте мне спросить это ... После вызова fork () могу ли я обработать сигнал Ctrl-Z всего с двумя функциями и только с pid?

Я хочу вызывать функцию ex put_background(pid_t pid), когда я нажимаю Ctrl-Z и выполняю процесс с pid = pid для запуска фона и, наконец, вызываю другую функцию ex put_foreground(pid_t pid), когда я пишу fg и мне нужен процессс pid = pid, чтобы снова выйти на передний план.

Итак, возможно ли это?Любая помощь приветствуется .. код больше, однако.

1 Ответ

0 голосов
/ 21 октября 2018

Я пытаюсь реализовать простую оболочку на языке 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 также остановит ее.

...