2012-03-06 18 views
6

Estoy implementando un syscall que se llama en el espacio de usuario, digamos por foo. El syscall accede al task_struct de foo (a través del puntero global actual), imprime su nombre y pid, luego pasa al proceso principal de foo, al padre primario de foo, etc. Imprime todos sus nombres y pips hasta e incluyendo el proceso init.¿Los identificadores de proceso no son negativos en Linux?

El pid = 1 está reservado para init, el pid = 0 está reservado para swapper.

De acuerdo con task_struct de swapper, su proceso principal es él mismo.

Swapper (o sched) siempre tiene pid = 0 y siempre es el proceso principal de init?

¿Son todas las pids no negativas? ¿Está bien para mí hacer esa suposición?

Respuesta

1

Siempre es positivo o 0. Las fuentes del kernel lo definen como del tipo pid_t que, afaik se considera unsigned (aunque se define como firmado para poder hacer llamadas como fork return negative números en caso de errores).

+0

Gracias, comprobaré inmediatamente cómo se define pid_t. – Plazo

+1

Creo que está firmado, 'fork' devuelve' pid_t' que puede ser '-1'. También creo que recuerdo haberlo visto en algún encabezado. Necesito comprobar. Ofc, esto no quiere decir que el ID del proceso puede ser negativo –

+0

Está firmado, solo lo examinó. Pero es así para devolver los errores: D –

0

Sí, en realidad siempre son positivos.

Puede verificar esto mediante varias llamadas al sistema POSIX, como wait, que utilizan valores negativos para representar elementos tales como todos los procesos secundarios, o similares, y solo valores positivos representan PID válidos.

Ejemplo: http://linux.die.net/man/2/wait

4

Para responder a sus preguntas de manera más concisa:

  • de IBM Inside the Linux boot process describe el proceso Swapper como el proceso tiene un valor de PID de 0. En el inicio de este proceso se ejecuta /sbin/init (u otro proceso dado como parámetro por el gestor de arranque), que normalmente será el proceso con PID 1.
  • En sistemas Unix, los valores PID se asignan sequentially, comenzando desde el primer proceso hasta un valor máximo especificado ied por /proc/sys/kernel/pid_max. Por lo tanto, puede suponer con seguridad que todos los PID válidos tienen un valor positivo, mientras que los negativos se reducen a valores de error y demás.
  • Una buena idea también sería tener en cuenta los procesos zombie, ya que pueden recibir "tratamiento especial" en el árbol de procesos cuando/si son adoptados por init.
Cuestiones relacionadas