Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Процессам, которые требуют специальный код для правильных приостановок, обычно необходимо выполнять специальные действия при перезапуске. Это легко делается предоставлением обработчика сигнала для

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

Ниже приведен код простого обработчика сигналов

SIGCONT
и
SIGTSTP
. Когда пользователь приостанавливает или перезапускает процесс, последний отображает сообщение
перед остановкой или продолжением.

 1: /* monitor.с */

 2:

 3: #include <signal.h>

 4: #include <stdio.h>

 5: #include <string.h>

 6: #include <unistd.h>

 7:

 8: void catchSignal(int sigNum, int useDefault);

 9:

10: void handler(int signum) {

11: if (signum == SIGTSTP) {

12: write(STDOUT_FILENO, "получен SIGTSTP\n", 12);

13: catchSignal(SIGTSTP, 1);

14: kill(getpid, SIGTSTP);

15: } else {

16: write(STDOUT_FILENO, "получен SIGCONT\n", 12);

17: catchSignal(SIGTSTP, 0);

18: }

19: }

20:

21: void catchSignal(int sigNum, int useDefault) {

22: struct sigaction sa;

23:

24: memset(&sa, 0, sizeof(sa));

25:

26: if (useDefault)

27: sa.sa_handler = SIG_DFL;

28: else

29: sa.sa_handler = handler;

30:

31: if (sigaction(sigNum, &sa, NULL)) perror("sigaction");

32: }

33:

34: int main {

35: catchSignal(SIGTSTP, 0);

36: catchSignal(SIGCONT, 0);

37:

38: while(1);

39:

40: return 0;

41: }

15.2. Управление заданиями в

ladsh

Добавление управления заданиями к

ladsh
— это последнее добавление к простой оболочке, окончательный исходный код которой можно найти в приложении Б. Для начала потребуется добавить по элементу в структуры
struct childProgram
,
struct job
и
struct jobSet
. Поскольку
ladsh
некоторое время не рассматривался, вернитесь в главу 10, где были впервые представлены эти структуры данных. Ниже показано окончательное определение
struct childProgram
.

35: struct childProgram {

36: pid_t pid; /* 0 на выходе */

37: char ** argv; /*
имя программы с аргументами * /

38: int numRedirections; /* элементы в массиве переадресации */

39: struct redirectionSpecifier * redirections; /* переадресации ввода-вывода */

40: glob_t globResult; /* результат универсализации параметров */

41: int freeGlob; /* должен ли освобождаться globResult? */

42: int isStopped; /* выполняется ли программа в данный момент?*/

43: };

Мы уже различаем работающие и завершенные дочерние программы с помощью элемента

pid
структуры
struct childProgram
, равного нулю в случае завершения дочерней программы, а в противном случае содержащего действительный идентификатор процесса. Новый элемент,
isStopped
, не равен нулю, если процесс был остановлен, в ином же случае он равен нулю. Обратите внимание, что его значение неважно, если
pid
равен нулю.

Аналогичные изменения потребуется внести и в

struct job
. Ранее эта структура отслеживала определенное количество программ в задании и количество выполняющихся процессов. Ее новый элемент,
stoppedProgs
, записывает количество процессов задания, остановленных в данный момент. Он может быть вычислен на основе элементов
isStopped
дочерних программ, содержащихся в задании, но лучше отслеживать его отдельно. После этого изменения получаем окончательную форму структуры
struct job
.

45: struct job {

46: int jobld; /* номер задания */

47: int numProgs; /* количество программ в задании */

48: int runningProgs; /* количество выполняющихся программ */

49: char * text; /* имя задания */

50: char * cmdBuf; /* буфер различных argv */

51: pid_t pgrp; /* идентификатор группы процессов задания */

52: struct childProgram* progs; /* массив программ в задании */

53: struct job * next; /* для слежения за фоновыми программами */

54: int stopped Progs; /* количество активных, однако остановленных программ */

55: };

Как и предыдущие версии

ladsh
, код
ladsh4.с
игнорирует
SIGTTOU
. Это делается, чтобы позволить использовать
tcsetpgrp
даже тогда, когда оболочка не является процессом переднего плана. Однако поскольку оболочка уже будет поддерживать правильное управление заданиями, дочерним процессам не следует игнорировать сигнал. Как только новый процесс разветвляется с помощью
runCommand
, он устанавливает обработчик для
SIGTTOU
в
SIG_DFL
. Это позволяет драйверу терминала приостановить фоновые процессы, пытающиеся выполнить запись в терминал или провести с ним еще какие-то действия. Ниже приведен код, который начинается с создания дочернего процесса, где сбрасывается
SIGTTOU
и выполняется дополнительная работа по синхронизации.

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2