2012-03-05 8 views
6

私はglibcで作業しており、現在のスレッドのIDを取得する必要があります。この場合、私は使用する syscall(SYS_gettid);問題は、私はの代わりにbits/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

これは問題ありません。それは問題なく動作します。同様のコードはglibcが書かれていれば動作しません。あなたはSYS_gettidへの参照エラーを取得し、未定義になります。その場合、_LIBCが真であるため、ビット/ syscall.hはインクルードされません。私はあなたが今理解して欲しいです。 – Kapil

+1

OPは 'syscall()'や 'gettid()'の使い方を知っているので、これは本当の答えではありません。問題は、glibcライブラリの中でどうやってやるかということでした。あなたのコードサンプルは合法的なC98ではなく、必要なものが含まれていなかったことは言うまでもありません。 –

関連する問題