我在glibc工作,我需要获取当前线程的id。为此,我使用
syscall(SYS_gettid);
问题是,我被迫包括bits/syscall.h
而非理想情况,即sys/syscall.h
。
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
说明了这一点
“永远不要直接使用bits / syscall.h;而是包含sys / syscall.h。”
由于_LIBC
将在我的情况下定义,因为我正在malloc.c
直接编写代码,
请建议我如何克服这一点。
谢谢, 卡皮尔
答案 0 :(得分: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;
}