GCC警告使用glibc 2.30-8的getId()系统调用包装器

GCC警告使用glibc 2.30-8的getId()系统调用包装器,c,linux,system-calls,glibc,C,Linux,System Calls,Glibc,和/或全部建议在glibc2.30中实现了gettid()。根据ldd--version,我想我正在使用glibc2.30-8,但是gcc仍然会抱怨-警告:函数“gettid”的隐式声明;你是说“getgid”吗?[-Wimplicit函数声明]。我可以忽略警告,程序运行正常 我试图与getId()一起使用的标题是,位于手册页之后。我错过什么了吗 使用头调用syscall(SYS\u getId)不会触发来自gcc的警告注意:这是一个非常新的方法,在没有某些条件的情况下不应该依赖它。而且,可能永

和/或全部建议在glibc2.30中实现了
gettid()
。根据
ldd--version
,我想我正在使用glibc2.30-8,但是
gcc
仍然会抱怨-警告:函数“gettid”的隐式声明;你是说“getgid”吗?[-Wimplicit函数声明]。我可以忽略警告,程序运行正常

我试图与
getId()
一起使用的标题是
,位于手册页之后。我错过什么了吗


使用头
调用
syscall(SYS\u getId)
不会触发来自
gcc

的警告注意:这是一个非常新的方法,在没有某些条件的情况下不应该依赖它。而且,可能永远都无法依赖

见下文


2019年2月之前,主页上是这么说的:

发件人:
mangetId

注意:此系统调用没有glibc包装器;见附注

根据注释:

Glibc不提供此系统调用的包装器;使用
syscall(2)
调用它

有关更多详细信息,请参阅“注释”部分的其余部分。这是因为他们希望您使用与
pthread\u self
兼容的其他东西

这是一种我个人不同意的
glibc
怪癖/哲学

因为,有时需要使用real/linux
tid


新方法是[截至2019年2月,per Joseph]:

#define _GNU_SOURCE
#include <unistd.h>
事实上,它甚至比这更复杂,因为我们必须确保在开始包含内容之前,我们有一个
\u GLIBC\u PREREQ
[和
\u GLIBC\u
\u GLIBC\u MINOR\u
]的定义

而且,要做到这一点是有问题的。因此,人们可能会被迫一直这样做:

#define _GNU_SOURCE
#include <unistd.h>

而且,由于新方法打破了15年的兼容性,手册页需要记录这一事实并解释旧方法

因为,试图编写跨平台代码、跨多个内核版本和多个
glibc
版本的开发人员需要了解这一点


更新:

以前没有添加它有很好的理由——它不是应用程序使用的受支持的抽象

这仍然不能给他们打破向后兼容性的许可

此外,还必须为特殊应用程序(例如,与给定设备驱动程序密切合作的应用程序)合成缺失的功能

久久

15年以上

glibc对可能的线程模型很感兴趣,在这种模型中,内核tid在线程生命周期中不是一个不变量

内核对
pthread\u t
一无所知。它只知道
tid
。这就是应用程序与内核通信的方式(例如,
tgkill

在内核模型中没有任何东西会改变<代码> TID< /Cord>中流,只不过它在执行过程中会改变<代码> PID 。 这是因为内核将

tid
视为调度的
pid
。每个进程和每个线程都有一个任务结构[索引/标识为
pid/tid
]

否则,需要对所有内核调度器、任务/线程层次结构等进行大修。因此,
glibc
不可能单独做到这一点。那么,为了什么

clone
syscall创建线程[使用相同地址空间的选项]之后,这在很大程度上是一种无形的区别,线程在调度时(基于调度程序和任务优先级)的权重相等

这是内核方法的最大好处之一:任务/线程在调度时是一等公民(不像WinX)

旁注:我必须编写一个实时嵌入式H/W H.264视频编码器,并且必须处理
nptl
[即
linuxthreads
(?)]的前身,这导致了吞吐量和延迟方面的严重问题。幸运的是,
nptl
在我们发货之前就出现了。差别是白天和黑夜

直到最近的讨论之后,才认为这是可以的

内核[和/或POSIX]定义语义,而不是glibc。glibc需要遵循和实施,而不是发号施令


而且,由于
glibc
的人一直顽固不化[而且令人讨厌],而且花了15年时间才做出[显而易见的]决定,IMO,他们在这件事上失去了任何讨价还价的权利。

手册页关于该功能的信息是错误的。请执行以下操作,而不是“包含”:

#define _GNU_SOURCE
#include <unistd.h>
定义GNU源
#包括

我向手册页邮件列表发送了一封电子邮件,要求更正此问题。

使用
getId()
,您试图解决什么更大的问题?只是好奇?使用线程?我认为您需要
#include
,即使手册页没有这样说
sys/types.h
是v2.30之前的
pid\u t
所需要的,但是
unistd.h
包含了它。@SteveFriedl我正在玩nptl pthread,并在glibc实现中摸索。
包含定义GNU源代码
更改为
\define\GNU源代码
。请阅读中的
注释:
。那么,您确定更改后仍会触发警告吗?grep gettid-r/usr/include/bits/的输出是什么?谢谢@KamilCuk,这确实是问题所在。克雷格的回答更详细地说明了这一点。你的信息已经过时了。自2019年2月以来,gettid已经有了一个glibc包装器(提交1d0fc213824eaa2a8f8c4385daaa698ee8fb7c92),而当前的手册页不再说没有了。@Joseph几乎不值一个DV。这是如此之新,以至于依赖它将打破大多数当前/稳定的发行版[我的ubuntu 18.02几天前更新]。最好
#define _DECLARE_GETTID
#include <unistd.h>
#define _GNU_SOURCE
#include <unistd.h>