2012-03-05 3 views
6

Я работаю в glibc, и мне нужно получить идентификатор текущей темы. Для этого я использую syscall(SYS_gettid); Проблема: я вынужден включить bits/syscall.h вместо идеального случая i.e sys/syscall.h.call gettid witin glibc

sys/syscall.h Внутренние звонки bits/syscall.h, но это обернуто #ifndef _LIBC макросами.

т.е.
 #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 

также bits/syscall.h утверждает, что "Никогда не используйте бит/syscall.h непосредственно, включают SYS/syscall.h вместо этого."

Поскольку _LIBC будет определен в моем случае, так как я пишу код непосредственно в malloc.c, , пожалуйста, предложите мне, как я могу это преодолеть.

Спасибо, Капил

+0

Почему бы вам просто не использовать '__NR_gettid'? –

ответ

16

gettid() системный вызов. Что касается, как я знаю, для Gettid нет оболочки glibc. Вам нужно вызвать gettid(), используя syscall(). Следующий код работает для меня.

#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

это нормально. Он будет работать, никаких проблем. Аналогичный код не будет работать, если написано iside glibc. и вы получите неопределенную ссылочную ошибку SYS_gettid, и это будет связано с тем, что бит/syscall.h не будет включен в качестве _LIBC в этом случае. Надеюсь, вы поняли сейчас. – Kapil

+1

На самом деле это не ответ, потому что OP знает, как использовать 'syscall()' или 'gettid()'. Вопрос состоял в том, как это сделать в библиотеке glibc. Не говоря уже о том, что ваш образец кода не был законным C98 и в нем отсутствовали необходимые сведения. –

 Смежные вопросы

  • Нет связанных вопросов^_^