Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

317
Vistas
syscall (SYS_getuid) devuelve un resultado diferente de getuid ()

Me gustaría usar syscalls para obtener la identificación del usuario actual. Lo probé así:

 #include <unistd.h> #include <sys/syscall.h> #include <stdio.h> int main(int argc, char *argv[]) { int uid = syscall(SYS_getuid); printf("%d\n", uid); return 0; }

Lo ejecuté con root, pero imprime -1 en lugar de 0 .

Si lo reemplazo con int uid = syscall(SYS_getuid); , entonces devuelve correctamente 0 . ¿Qué hago mal? ¿Cómo obtener la identificación de usuario actual usando syscall ?

Lo ejecuto en i686/ubuntu docker image, porque tengo que crear ejecutables de 32 bits.


Ejemplo mínimo reproducible:

Dockerfile

 FROM i686/ubuntu RUN apt-get update RUN apt-get install --assume-yes --no-install-recommends --quiet \ gcc libc6-dev RUN apt-get clean all

C Principal

 #include <unistd.h> #include <sys/syscall.h> #include <stdio.h> #include <errno.h> #include <string.h> int main(int argc, char *argv[]) { int uid = syscall(SYS_getuid);//getuid();// if(uid == -1) printf("Error: %s\n", strerror(errno)); printf("%d\n", uid); return 0; }

Ejecutar (en x64 Windows10):

 docker build --platform linux/386 -t my-gcc . docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc gcc -m32 -xc /usr/local/src/main.c -o /usr/local/src/main docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc /usr/local/src/main

El resultado es:

 Error: Function not implemented -1
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Por getuid(2) :

Las llamadas al sistema getuid() y geteuid() originales de Linux solo admitían ID de usuario de 16 bits. Posteriormente, Linux 2.4 agregó getuid32() y geteuid32(), que admiten ID de 32 bits. Las funciones contenedoras getuid() y geteuid() de glibc tratan de forma transparente las variaciones entre las versiones del núcleo.

Aparentemente, está ejecutando su programa en un kernel que tiene compilada la antigua llamada al sistema getuid , y solo getuid32 está disponible en x86-32. Si ejecuta fgrep CONFIG_UID16 "/boot/config-$(uname -r)" , podrá ver si su kernel en ejecución admite la llamada al sistema de 16 bits. Si este comando muestra algo diferente a CONFIG_UID16=y , significa que la antigua llamada al sistema no está disponible.

Si invoca SYS_getuid32 en su lugar, debería funcionar bien. Tenga en cuenta que SYS_getuid32 puede no estar disponible en otras arquitecturas.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda