Являются ли идентификаторы процессов неотрицательными в Linux? - PullRequest
6 голосов
/ 06 марта 2012

Я реализую системный вызов, который вызывается в пространстве пользователя, скажем, с помощью foo.Системный вызов получает доступ к task_struct foo (через текущий глобальный указатель), печатает его имя и pid, затем переходит к родительскому процессу foo, родительскому родительскому элементу foo и т. Д. Печатает все их имена и pids вплоть до процесса init.

pid = 1 зарезервирован для init, pid = 0 зарезервирован для подкачки.

В соответствии с task_struct подкачки, его родительский процесс сам по себе.

Swapper (или sched) всегдаимеет pid = 0 и всегда ли родительский процесс init?

Все ли pids неотрицательны?Это нормально для меня, чтобы сделать это предположение?

Ответы [ 3 ]

5 голосов
/ 05 апреля 2012

Чтобы ответить на ваши вопросы более кратко:

  • IBM Внутри процесса загрузки Linux описывает процесс подкачки как процесс, имеющий значение PID, равное 0. При запуске этот процесс запускается /sbin/init (или другой процесс, указанный в качестве параметра загрузчиком), который как правило, будет процесс с PID 1.
  • В системах Unix значения PID присваиваются последовательно , начиная с первого процесса и вплоть до максимального значения, указанного /proc/sys/kernel/pid_max. Поэтому можно смело исходить из предположения, что все действительные идентификаторы PID имеют положительное значение, а отрицательные значения сводятся к значениям ошибок и т. Д.
  • Хорошей идеей также будет учет процессов zombie , поскольку они могут получать "особую обработку" в дереве процессов, когда / если они будут приняты init.
1 голос
/ 06 марта 2012

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

0 голосов
/ 06 марта 2012

Да, они на самом деле всегда положительны.

Это можно проверить с помощью нескольких системных вызовов POSIX, таких как wait, которые используют отрицательные значения для представления таких вещей, как все ваши дочерние процессы или тому подобное.и только положительные значения представляют действительные PID.

Пример: http://linux.die.net/man/2/wait

...