Linux kernel 打电话给gettid witin glibc

Linux kernel 打电话给gettid witin glibc,linux-kernel,malloc,glibc,system-calls,libc,Linux Kernel,Malloc,Glibc,System Calls,Libc,我在glibc中工作,需要获取当前线程的id。为此,我使用 syscall(SYS\u getid)问题是,我被迫包括位/syscall.h而不是理想情况,即sys/syscall.h sys/syscall.h内部调用bits/syscall.h,但它是用\ifndef\u LIBC宏包装的。i、 e #ifndef _LIBC /* The Linux kernel header file defines macros `__NR_<name>', bu

我在glibc中工作,需要获取当前线程的id。为此,我使用
syscall(SYS\u getid)问题是,我被迫包括
位/syscall.h
而不是理想情况,即
sys/syscall.h

sys/syscall.h
内部调用
bits/syscall.h
,但它是用
\ifndef\u LIBC
宏包装的。i、 e

     #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
\ifndef\u LIBC
/*Linux内核头文件定义了宏“\uuunr\unr”,但有些
程序希望使用传统的“SYS_2;”形式。所以在构建libc时
我们扫描内核列表并使用宏生成
所有的“系统”名称*/
#包括
#恩迪夫
另外
bits/syscall.h
指出 “切勿直接使用bits/syscall.h;应包括sys/syscall.h。”

由于
\u LIBC
将在我直接在
malloc.c
中编写代码的情况下定义, 请建议我如何克服这个问题

谢谢, Kapil

getId()是一个系统调用。据我所知,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;
}
#包括
#包括
#包括
#包括
int main()
{
长tid;
tid=syscall(SYS\u gettid);
printf(“%ld\n”,tid);
返回退出成功;
}

这很好。它会起作用,没有问题。如果编写iside glibc,类似的代码将不起作用。您将获得SYS_getId的未定义引用错误,这是由于bits/syscall.h不会被包括在内,因为在这种情况下_LIBC为true。我希望您现在明白了。这不是真正的答案,因为OP知道如何使用
syscall()
gettid()
。问题是如何在glibc库中实现这一点。更不用说您的代码示例不是合法的C98,并且缺少必要的include。(许多年后)它看起来像Linux,因此如果您知道您使用的版本等于或高于此版本,您就不需要将其作为系统调用来执行()…为什么不使用
\uu NR\u getId
?它将在glibc 2.30中提供: