2012-03-05 18 views
6

Estoy trabajando en glibc y necesito obtener el id del hilo actual. Para esto yo uso syscall(SYS_gettid); El problema es que estoy obligado a incluir bits/syscall.h en lugar de caso ideal, es decir sys/syscall.h.call gettid witin glibc

sys/syscall.h llamadas internas bits/syscall.h pero eso se envuelve con #ifndef _LIBC macro. es decir

 #ifndef _LIBC 
     /* The Linux kernel header file defines macros `__NR_<name>', but some 
      programs expect the traditional form `SYS_<name>'. So in building libc 
      we scan the kernel's list and produce <bits/syscall.h> with macros for 
      all the `SYS_' names. */ 
     # include <bits/syscall.h> 
    #endif 

también bits/syscall.h establece que "Nunca use bits/syscall.h directamente; incluyen SYS/syscall.h lugar."

Desde _LIBC se definirá en mi caso ya que estoy escribiendo código directamente en malloc.c, Para sugerir mi ¿Cómo puedo superar esto.

Gracias, Kapil

+0

¿Por qué no simplemente usas '__NR_gettid'? –

Respuesta

16

gettid() es una llamada al sistema. En cuanto a lo que sé, no hay envoltorio glibc para gettid. Necesita invocar gettid() usando syscall(). El siguiente código funciona para mí.

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

int main() 
{ 
    long tid; 

    tid = syscall(SYS_gettid); 
    printf("%ld\n", tid); 
    return EXIT_SUCCESS; 
} 
+1

esto está bien. Funcionará, sin problemas. El código similar no funcionará si se escribe iside glibc. y obtendrá un error de referencia indefinido para SYS_gettid y eso se deberá al hecho de que bits/syscall.h no se incluirán, ya que _LIBC es verdadero en ese caso. Espero que lo hayas entendido ahora. – Kapil

+1

Esto no es realmente una respuesta porque OP sabe cómo usar 'syscall()' o 'gettid()'. La pregunta era cómo hacerlo dentro de la biblioteca glibc. Sin mencionar que tu código de muestra no era legal C98 y faltaba necesario. –