Основы операционных систем. Практикум



         

Понятия группы процессов, сеанса - часть 2


К сожалению, не во всех версиях UNIX присутствует данный системный вызов. Здесь мы сталкиваемся с тяжелым наследием разделения линий UNIX'ов на линию BSD и линию System V, которое будет нас преследовать почти на всем протяжении данной темы. Вместо вызова getpgid() в таких системах существует системный вызов getpgrp(), который возвращает номер группы только для текущего процесса.

Системный вызов getpgid()

Прототип системного вызова

#include <sys/types.h> #include <unistd.h> pid_t getpgid(pid_t pid);

Описание системного вызова

Системный вызов возвращает идентификатор группы процессов для процесса с идентификатором pid.

Узнать номер группы процесс может только для себя самого или для процесса из своего сеанса. При других значениях pid системный вызов возвращает значение -1.

Тип данных pid_t является синонимом для одного из целочисленных типов языка C.

Системный вызов getpgrp()

Прототип системного вызова

#include <sys/types.h> #include <unistd.h> pid_t getpgrp(void);

Описание системного вызова

Системный вызов getpgrp возвращает идентификатор группы процессов для текущего процесса.

Тип данных pid_t является синонимом для одного из целочисленных типов языка C.

Для перевода процесса в другую группу процессов, возможно, с одновременным ее созданием, применяется системный вызов setpgid(). Перевести в другую группу процесс может либо самого себя (и то не во всякую и не всегда), либо свой процесс-ребенок, который не выполнял системный вызов exec(), т.е. не запускал на выполнение другую программу. При определенных значениях параметров системного вызова создается новая группа процессов с идентификатором, совпадающим с идентификатором переводимого процесса, состоящая первоначально только из одного этого процесса. Новая группа может быть создана только таким способом, поэтому идентификаторы групп в системе уникальны. Переход в другую группу без создания новой группы возможен лишь в пределах одного сеанса.

В некоторых разновидностях UNIX системный вызов setpgid() отсутствует, а вместо него используется системный вызов setpgrp(), способный только создавать новую группу процессов с идентификатором, совпадающим с идентификатором текущего процесса, и переводить в нее текущий процесс. (В ряде систем, где сосуществуют вызовы setpgrp() и setpgid(), например в Solaris, вызов setpgrp() ведет себя иначе – он аналогичен рассматриваемому ниже вызову setsid().)




Содержание  Назад  Вперед