2012-03-05 3 views
6

저는 glibc에서 작업 중이며 현재 스레드의 ID를 가져와야합니다. 이를 위해 syscall(SYS_gettid); 문제는 이상적인 경우 대신 bits/syscall.h을 포함해야합니다 (예 : sys/syscall.h).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 포함"한다고

내 경우에는 malloc.c에 코드를 직접 작성하므로 _LIBC이 정의 될 예정이므로이 문제를 극복 할 수있는 방법을 제안하십시오.

감사합니다, 카필

+0

왜 '__NR_gettid'를 사용하지 않으시겠습니까? –

답변

16

gettid는() 시스템 호출이다. 내가 아는 한 gettid에 glibc 래퍼가 없습니다. syscall()을 사용하여 gettid()를 호출해야합니다. 다음 코드는 나를 위해 작동합니다.

#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

괜찮습니다. 작동 할 것이고 아무런 문제가 없습니다. 비슷한 코드는 글라이드가 쓰여진다면 작동하지 않을 것이다. 그리고 당신은 SYS_gettid에 대한 참조 에러를 얻을 것이고 정의되지 않을 것입니다. 그리고 그 경우에 _LIBC가 참이므로 비트/syscall.h가 포함되지 않을 것이기 때문입니다. 나는 네가 지금 이해하기를 바란다. – Kapil

+1

OP는'syscall()'또는'gettid()'를 사용하는 방법을 알고 있기 때문에 이것은 실제로 대답이 아닙니다. 문제는 glibc 라이브러리에서 어떻게 처리 할 것인가였다. 당신의 코드 샘플이 합법적 인 C98이 아니며 필요한 것을 빠뜨린 것도 언급 할 필요가 없습니다. –