Группы процесса POSIX

(function (msg){alert(msg)})
('SO');

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

Эта функция вызывается автоматически при компиляции кода.

Если поместить ; в первую строку, компилятор обрабатывает его как две разные строки. Таким образом, вы не можете получить те же результаты, что и выше.

Это также может быть записано как:

(function (msg){alert(msg)}('SO'));

Для более подробной информации, посмотрите в JavaScript / анонимные функции .

12
задан Matthew Iselin 26 June 2009 в 01:16
поделиться

1 ответ

Интересный вопрос - не в последнюю очередь потому, что он оставался без даже частичного ответа так долго.

Базовые определения POSIX

Некоторые цитаты из части определений POSIX:

3.290 Группа процессов

Совокупность процессов, которые позволяют сигнализировать о связанных процессах. Каждый процесс в системе является членом группы процессов, которая идентифицируется идентификатором группы процессов. Вновь созданный процесс присоединяется к группе процессов своего создателя.

3.291 Идентификатор группы процессов

Уникальный положительный целочисленный идентификатор, представляющий группу процессов в течение ее жизненного цикла.

Примечание. См. Также Повторное использование идентификатора группы процессов, определенное в разделе «Повторное использование идентификатора процесса».

3.292 Лидер группы процессов

Процесс, идентификатор процесса которого совпадает с идентификатором группы процессов.

3.293 Время жизни группы процессов

Период времени который начинается, когда группа процессов создается, и заканчивается, когда последний оставшийся процесс в группе покидает группу, либо из-за окончания времени жизни последнего процесса, либо из-за того, что последний оставшийся процесс вызывает функции setsid () или setpgid () .

Примечание: Функции setsid () и setpgid () подробно описаны в томе Системные интерфейсы POSIX.1-2008.

[...]

3.337 Сеанс

Набор групп процессов, установленных для управления заданиями. Каждая группа процессов является членом сеанса. Процесс считается участником сеанса, членом которого является его группа процессов. Вновь созданный процесс присоединяется к сеансу его создателя. Процесс может изменить свое членство в сеансе; см. setsid (). В одном сеансе может быть несколько групп процессов.

Примечание: Функция setsid () подробно описана в томе «Системные интерфейсы» в POSIX.1-2008.

3.338 Лидер сеанса

Процесс, создавший сеанс.

Примечание: Для получения дополнительной информации см. Функцию setsid (), определенную в томе «Системные интерфейсы» в POSIX.1-2008.

3.339 Время жизни сеанса

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


Системные интерфейсы POSIX

NAME

setsid - создать сеанс и установить идентификатор группы процессов

SYNOPSIS

  #include 

 pid_t setsid (недействительно);

ОПИСАНИЕ

Функция setsid () должна создать новый сеанс, если вызывающий процесс не является лидером группы процессов. По возвращении вызывающий процесс должен быть лидером сеанса этого нового сеанса, должен быть лидером группы процессов новой группы процессов и не должен иметь управляющего терминала. Идентификатор группы процессов вызывающего процесса должен быть установлен равным идентификатору процесса вызывающего процесса. Вызывающий процесс должен быть единственным процессом в новой группе процессов и единственным процессом в новом сеансе.

И:

ИМЯ

setpgid - установить идентификатор группы процессов для управления заданиями

СИНТАКСИС

  #include 

 int setpgid (pid_t pid, pid_t pgid);

ОПИСАНИЕ

Функция setpgid () должна либо присоединиться к существующей группе процессов, либо создать новую группу процессов в рамках сеанса вызывающего процесса.

Идентификатор группы процессов лидера сеанса не должен изменяться.

] После успешного завершения, идентификатор группы процессов процесса с идентификатором процесса, который соответствует pid, должен быть установлен на pgid.

В качестве особого случая, если pid равен 0, должен использоваться идентификатор процесса вызывающего процесса. Также, если pgid равен 0, должен использоваться идентификатор указанного процесса.


Интерпретация

Как ясно из определений, сеанс может состоять из нескольких групп процессов. В широких пределах процесс может изменять группы процессов (хотя он принадлежит только одной группе процессов в любое время). Возможности обработки сеанса более ограничены; в принципе, процесс либо остается участником своего исходного сеанса, либо может стать лидером нового сеанса.

Копирование частей вопроса:

Наш терминальный уровень отправляет SIGINT процессу переднего плана (группе, идентификатор которой должен равен PID лидера группы). В этом случае этот процесс переднего плана (наше приложение для входа в систему) становится лидером группы путем вызова setsid. Когда пользователь входит в систему, программа разветвляется и запускает оболочку пользователя. На этом этапе я понимаю, что я вызываю setpgid из разветвленного дочернего элемента перед вызовом exec *. Это означает, что исполняемая программа будет с самого начала частью группы процессов.

Я подозреваю, что круглые скобки должны быть «группой процессов переднего плана (чей id должен быть равен PID лидера группы)». По определению (3.292) лидер группы процессов - это процесс, PID которого совпадает с идентификатором группы процессов. Я не цитировал соответствующий материал, но считаю, что отправка сигнала лидеру группы процессов является правильной

. Обратите внимание, что процесс переднего плана становится лидером сеанса, вызывая setsid () , а также становится руководитель группы процессов тоже. Я ожидал, что программа входа в систему настроит оболочку пользователя как лидера группы процессов (и, возможно, лидера сеанса) после разветвления, но до выполнения оболочки. Все дочерние процессы автоматически наследуют группу процессов и сеанс от своих родительских процессов; вы должны переопределить это, если хотите, чтобы все было по-другому.

Если бы я хотел запустить только что разветвленный дочерний элемент вне группы процессов, я бы просто вызвал setsid в разветвленном дочернем элементе перед вызовом exec *.

Вы могли бы сделать это , но это также создаст новый сеанс. Вероятно, вы захотите использовать setpgid () (современный стандарт; возможно, setpgrp () , который является более старым стандартом от SVID), а не setsid () .

. ]Это верно? Есть ли какие-то действительно непонятные вещи, которые я должен проверить или сделать?

Да, в основном это правильно. Да, вероятно, есть и некоторые непонятные вещи, за которыми стоит следить. Например, вам, возможно, придется подумать об управляющем телетайпе.

В качестве дополнительного вопроса, который, как мне кажется, я уже знаю, требуется ли вилка для передачи членства в группе? Или это нужно делать с помощью setpgid после каждого вызова fork? Собираю группы процессов передаются fork из определения fork в POSIX.

15
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: