Для хранения данных о каждом процессе используется специальная структура — дескриптор (описатель) процесса. К наиболее важным сведениям о процессе относятся:
— идентификатор процесса и родительского процесса;
— идентификатор пользователя, запустившего процесс и эффективный идентификатор пользователя; идентификатор группы и эффективный идентификатор группы;
— приоритет процесса;
— текущее состояние процесса;
— информация об используемых ресурсах.
Ядро назначает каждому процессу уникальный идентификатор (Process ID, PID). Его тип можно привести к целочисленному, максимальное значение по умолчанию равно 32768. Большинство команд и системных вызовов, работающих с процессами, требует указания конкретного идентификатора, чтобы был ясен контекст операции. Идентификаторы присваиваются по порядку по мере создания процессов.
Процесс создается уже существующим процессом с помощью системного вызова fork(). Ответвившиеся процессы считаются дочерними, а процессы, от которых они ответвились, родительскими. Дочерний и родительский процессы продолжают выполняться параллельно. Если родитель продолжает порождать новые дочерние процессы, эти процессы становятся сестринскими по отношению к первому дочернему. Дети, в свою очередь, могут сами порождать дочерние процессы. Так образуется иерархическая связь между процессами, определяющая их родство.
При создании процесса дочерний процесс получает копию родительного пространства данных, кучу, стек и дескриптор процесса, которые впоследствии могут изменяться.
Помимо собственного идентификатора, каждый дочерний процесс имеет атрибут PPID (Parent Process ID), который совпадает с идентификатором породившего его родительского процесса (по крайней мере, поначалу).
Исключение составляет лишь самый первый процесс-демон init, который запускается специальным образом и порождает все остальные процессы. Его PID равен 1.