2012-03-05 13 views
6

Sto lavorando in glibc e ho bisogno di ottenere l'id del thread corrente. Per questo io uso syscall(SYS_gettid); Il problema è che, sono costretto a includere bits/syscall.h invece del caso ideale i.e sys/syscall.h.chiamata gettid witin glibc

sys/syscall.h chiama internamente bits/syscall.h ma è incluso nella macro #ifndef _LIBC. cioè

 #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 

anche bits/syscall.h afferma che "Non utilizzare mai bit/syscall.h direttamente;. comprendono sys/syscall.h invece"

Dal sarà definito nel mio caso come sto scrivendo il codice direttamente in malloc.c, si prega di suggerire il mio come posso superare questo.

Grazie, Kapil

+0

Perché non usi solo "__NR_gettid'? –

risposta

16

gettid() è una chiamata di sistema. Per quanto ne so, non ci sono glibc wrapper per gettid. Devi invocare gettid() usando syscall(). Il seguente codice funziona per me.

#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

questo va bene. Funzionerà, nessun problema. Il codice simile non funzionerà se scritto iside glibc. e otterrete un errore di riferimento non definito su SYS_gettid e ciò sarà dovuto al fatto che bit/syscall.h non sarà incluso poiché _LIBC è vero in questo caso. Spero che tu abbia capito ora. – Kapil

+1

Questa non è davvero una risposta perché OP sa come usare 'syscall()' o 'gettid()'. La domanda era come farlo all'interno della libreria di glibc. Per non parlare del fatto che il tuo codice di esempio non era legale C98 e mancavano gli include necessari. –

Problemi correlati