Являются ли идентификаторы процессов неотрицательными в Linux?

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

pid=1 зарезервирован для инициализации, pid=0 зарезервирован для swapper.

Согласно task_struct swapper, его родительский процесс — это он сам.

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

Все pids неотрицательны? Могу ли я сделать такое предположение?


person Plazo    schedule 06.03.2012    source источник


Ответы (3)


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

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

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

person Mihai Maruseac    schedule 06.03.2012
comment
Спасибо, я немедленно проверю, как определяется pid_t. - person Plazo; 06.03.2012
comment
Я думаю, что он подписан, fork возвращает pid_t, который может быть -1. Также я думаю, что я помню, как видел это в каком-то заголовке. Нужно проверить. Конечно, это не означает, что идентификатор процесса может быть отрицательным. - person another.anon.coward; 06.03.2012
comment
Он подписан, только что посмотрел. Но это так, чтобы возвращать ошибки :D - person Mihai Maruseac; 06.03.2012
comment
поэтому он вернет ошибку родительскому процессу, используя отрицательный pid -1? но процесс никогда не будет иметь отрицательный идентификатор - person Plazo; 06.03.2012
comment
Возвращаемое значение fork В случае успеха родительскому процессу возвращается PID дочернего процесса, а дочернему — 0. В случае сбоя в родительском процессе возвращается -1, дочерний процесс не создается, а errno устанавливается соответствующим образом. - person Plazo; 06.03.2012
comment
Осторожный. Действительный pid никогда не равен нулю - person Guido; 20.03.2012

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

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

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

person Guido    schedule 06.03.2012