Читаем Linux API. Исчерпывающее руководство полностью

В некоторых реализациях UNIX (например, в HP-UX 11) вызов getsid() можно использовать для получения идентификатора SID только того процесса, который находится в одной сессии с вызывающим (данная возможность оговорена в стандарте SUSv3). Иными словами, исходя из успешного или неудачного (ошибка EPERM) выполнения этого вызова, можно понять, принадлежат ли заданный и вызывающий процессы к одной и той же сессии. Это ограничение не действует в Linux и большинстве других систем.

Если вызывающий процесс не является лидером своей группы, вызов setsid() создает новую сессию.

#include


pid_t setsid(void);

Возвращает идентификатор новой сессии или –1 (pid_t), если случилась ошибка

Создание новой сессии системным вызовом setsid() происходит следующим образом.

• Вызывающий процесс становится лидером новой сессии и новой группы процессов внутри нее. Идентификаторы PGID и SID нового процесса получают то же значение, что и сам процесс.

• Вызывающий процесс не имеет контролирующего терминала. Любое соединение с контролирующим терминалом, установленное ранее, разрывается.

Если вызывающий процесс является лидером своей группы, вызов setsid() завершается ошибкой EPERM. Чтобы этого избежать, проще всего выполнить fork() и дать родителю завершиться, после чего вызвать setsid() из потомка. Поскольку дочерний процесс наследует идентификатор PGID родителя и получает свой собственный идентификатор, он не может оказаться лидером группы.

Ограничение относительно возможности лидера группы вызывать setsid() является необходимым, иначе лидер смог бы переместить себя в другую (новую) сессию, оставляя остальные процессы в исходной сессии (при этом не была бы создана новая группа процессов, поскольку PGID лидера группы по определению совпадает с его собственным идентификатором). Это бы нарушило строгую двухуровневую иерархию сессий и групп процессов, так как все члены группы должны быть частью одной и той же сессии.

При создании нового процесса с помощью вызова fork() ядро выдает ему уникальный идентификатор и проверяет, чтобы этот идентификатор не совпадал с PGID или SID любого существующего процесса. То есть, даже если лидер группы или сессии уже завершился, новый процесс не может повторно использовать его идентификатор, чтобы случайно не стать лидером имеющейся сессии или группы.

В листинге 34.2 демонстрируется использование вызова setsid() для создания новой сессии. Чтобы убедиться в том, что данная программа больше не имеет контролирующего терминала, мы пытаемся открыть специальный файл /dev/tty (описанный в следующем разделе). Запустив программу, мы увидим следующее:

$ ps — p $$ — o 'pid pgid sid command' $$ — это ID процесса командной оболочки

PID PGID SID COMMAND

12243 12243 12243 bash Идентификатор процесса оболочки, ее PGID и SID

$ ./t_setsid

$ PID=12352, PGID=12352, SID=12352

ERROR [ENXIO Device not configured] open /dev/tty

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


Листинг 34.2. Создание новой сессии

pgsjc/t_setsid.c

#define _XOPEN_SOURCE 500

#include

#include

#include "tlpi_hdr.h"


int

main(int argc, char *argv[])

{

if (fork()!= 0) /* Выходим в случае ошибки или если это родитель */

_exit(EXIT_SUCCESS);


if (setsid() == –1)

errExit("setsid");


printf("PID=%ld, PGID=%ld, SID=%ld\n", (long) getpid(),

(long) getpgrp(), (long) getsid(0));


if (open("/dev/tty", O_RDWR) == –1)

errExit("open /dev/tty");

exit(EXIT_SUCCESS);

}

pgsjc/t_setsid.c


34.4. Контролирующие терминалы и контролирующие процессы


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

Стандарт SUSv3 содержит функцию tcgetsid(int fd) (объявленную в заголовочном файле ), которая возвращает идентификатор сессии, связанной с контролирующим терминалом fd. Эта функция предоставляется библиотекой glibc (и реализована с помощью операции TIOCGSID в вызове ioctl()).

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

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных