2012-03-05 21 views
6

मैं glibc में काम कर रहा हूं और मुझे वर्तमान धागे की आईडी प्राप्त करने की आवश्यकता है। इसके लिए मैं syscall(SYS_gettid); समस्या का उपयोग करता हूं, मुझे आदर्श मामले i.e sys/syscall.h के बजाय bits/syscall.h शामिल करने के लिए मजबूर होना पड़ता है।कॉल गेटिड बुद्धिमान 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() एक सिस्टम कॉल है। जैसा कि मुझे पता है कि गेटिड के लिए कोई ग्लिबैक रैपर नहीं है। आपको 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 को संदर्भ त्रुटि मिल जाएगी और अपरिभाषित हो जाएगी और यह इस तथ्य के कारण होगा कि बिट्स/syscall.h को उस मामले में _LIBC के रूप में शामिल नहीं किया जाएगा। मुझे उम्मीद है कि अब आप समझ गए हैं। – Kapil

+1

यह वास्तव में एक उत्तर नहीं है क्योंकि ओपी जानता है कि 'syscall() 'या' gettid() 'का उपयोग कैसे करें। सवाल यह था कि ग्लिब लाइब्रेरी के अंदर इसे कैसे किया जाए। उल्लेख नहीं है कि आपका कोड नमूना कानूनी C98 नहीं था और इसमें आवश्यक अनुपलब्ध था। –

संबंधित मुद्दे