2012-03-05 18 views
6

Tôi đang làm việc trong glibc và tôi cần lấy id của chuỗi hiện tại. Đối với điều này tôi sử dụng syscall(SYS_gettid); Vấn đề là, tôi buộc phải bao gồm bits/syscall.h thay vì trường hợp lý tưởng, ví dụ: sys/syscall.h.gọi gettid witin glibc

sys/syscall.h gọi nội bộ bits/syscall.h nhưng được gói bằng macro #ifndef _LIBC. tức là

 #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 

cũng bits/syscall.h khẳng định rằng "Không bao giờ sử dụng bit/syscall.h trực tiếp;. bao gồm sys/syscall.h thay vì"

_LIBC sẽ được xác định trong trường hợp của tôi khi tôi đang viết mã trực tiếp tại malloc.c, vui lòng đề xuất cách tôi có thể khắc phục điều này.

Xin cảm ơn, Kapil

+0

Tại sao bạn không sử dụng '__NR_gettid'? –

Trả lời

16

gettid() là cuộc gọi hệ thống. Đối với như tôi biết không có wrapper glibc cho gettid. Bạn cần gọi gettid() bằng syscall(). Mã sau hoạt động cho tôi.

#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

điều này là tốt. Nó sẽ hoạt động, không có vấn đề gì. Mã tương tự sẽ không hoạt động nếu được viết bằng glibc. và bạn sẽ nhận được và không xác định lỗi tham chiếu đến SYS_gettid và đó sẽ là do thực tế là bit/syscall.h sẽ không được bao gồm như _LIBC là đúng trong trường hợp đó. Tôi hy vọng bạn hiểu bây giờ. – Kapil

+1

Đây không thực sự là câu trả lời vì OP biết cách sử dụng 'syscall()' hoặc 'gettid()'. Câu hỏi đặt ra là làm thế nào để làm điều đó bên trong thư viện glibc. Chưa kể rằng mẫu mã của bạn không phải là C98 hợp pháp và bị thiếu bao gồm cần thiết. –