1

有谁知道在 BSD 上将当前线程 ID 作为整数获取?

我找到了这个

#ifdef RTHREADS
  299     STD     { pid_t sys_getthrid(void); }
  300     STD     { int sys_thrsleep(void *ident, int timeout, void *lock); }
  301     STD     { int sys_thrwakeup(void *ident, int n); }
  302     STD     { int sys_threxit(int rval); }
  303     STD     { int sys_thrsigdivert(sigset_t sigmask); }
#else
  299     UNIMPL
  300     UNIMPL
  301     UNIMPL
  302     UNIMPL
  303     UNIMPL
#endif

并尝试了(长)系统调用(229)但不起作用(它崩溃)。在 Linux 上,我可以通过系统调用 (long) syscall(224) 获取线程 ID,它给了我一个整数(通常是 4 位数字)。有人可以帮忙吗?!谢谢你。

4

2 回答 2

4

没有“BSD”这样的东西。每个 *BSD 系统都完全不同,尤其是在线程方面。即使在像 FreeBSD 这样的单个项目中,也有各种 pthread 实现(libc_r、kse、thr)在操作系统版本和用户配置之间有所不同。

话虽如此,在 FreeBSD-8 上应该有int thr_self(long *id)/usr/include/sys/thr.h 而在相当新鲜的 NetBSD 上应该lwpid_t _lwp_self(void)/usr/include/lwp.h

对于更多平台,您可以查看 wine 源中的int get_unix_tid(void)

于 2010-11-04T16:03:47.953 回答
0

找出哪些 <sys/types.h> 可以包含在您的 C 翻译单元中(通过检查 oyur 包含路径)。pid_t 在那里定义。它是有符号整数类型,但其中有一些。它很容易比长的更宽。

sys/types.h的 Open Groups 文档承诺“实现应支持一个或多个编程环境,其中 blksize_t、pid_t、size_t、ssize_t、suseconds_t 和 useconds_t 的宽度不大于 long 类型的宽度。名称可以使用 confstr() 函数或 getconf 实用程序获得这些编程环境。” 因此,您可能可以将 pid_t 转换为 long (或者至少使用 getconf 来找出在 pid_t 可以安全地转换为 long 的情况下您必须做什么)。

请参阅C 语言陷阱:printf 格式字符串,以讨论为什么您想做的事情很复杂,不能移植,并且将来可能会突然中断。

于 2010-10-23T13:50:08.267 回答