Leí que syscall (39) devuelve la identificación del proceso actual (pid)

Entonces, ¿por qué estos 2 programas generan 2 números diferentes?

int main() {
    long r = syscall(39);
    printf("returned %ld\n", r);
    return 0;
}

Y:

int main() {
    long r = getpid();
    printf("returned %ld\n", r);
    return 0;
}

Estoy ejecutando mi programa incluido, y cuando cambio la primera línea obtengo un resultado diferente, lo cual es realmente extraño.

Ejecutando el código en las respuestas que obtuve (en macos):

returned getpid()=9390 vs. syscall(39)=8340

Lo cual es realmente extraño.

En ubuntu tengo el mismo pid para ambos, ¿por qué?

2
john 7 may. 2021 a las 18:39

2 respuestas

La mejor respuesta

Hacer llamadas al sistema por su número no será portátil.

De hecho, vemos que 39 es getpid en Linux, pero getppid ("obtener el pid principal") en macOS.

getpid en macOS es 20.

Por eso ves un resultado diferente entre getpid() y syscall(39) en macOS.

Tenga en cuenta que macOS, al ser un derivado del kernel BSD, no está relacionado con Linux de ninguna manera. No puede ser posible, ya que es de código cerrado.

4
rustyx 7 may. 2021 a las 20:31

Hay un detalle clave que falta aquí: cada vez que ejecuta el programa, su sistema operativo le asigna un nuevo PID. Llamar al mismo programa dos veces seguidas probablemente devolverá diferentes PID, por lo que lo que está describiendo no es una buena manera de probar la diferencia entre getpid() y syscall(39).

Aquí hay un programa mejor para comparar los dos que llama a ambas funciones en el mismo programa.

#include <sys/syscall.h>
#include <stdio.h>

int main() {
    long pid1 = getpid();
    long pid2 = syscall(39);
    printf("returned getpid()=%ld vs. syscall(39)=%ld\n", pid1, pid2);
    return 0;
}

4
GandhiGandhi 7 may. 2021 a las 15:44