有没有人知道在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上,我可以通过系统调用(长)系统调用(224)获得线程ID,它给出一个整数(通常是4位数)。有人可以帮忙吗?!谢谢。
答案 0 :(得分:4)
没有“BSD”这样的东西。每个* BSD系统都完全不同,特别是涉及到线程时。即使在像FreeBSD这样的单个项目中,也有各种pthread实现(libc_r,kse,thr),它们在os版本和用户配置之间有所不同。
话虽如此,在FreeBSD-8上/usr/include/sys/thr.h应该有int thr_self(long *id)
,而在/usr/include/lwp.h {{}}} {{}}} {{}}} {} {}
对于更多平台,您可以查看葡萄酒来源中的int get_unix_tid(void)。
答案 1 :(得分:0)
找出< sys / types.h>可以包含在您的C翻译单元中(通过检查oyur包括路径)。 pid_t在那里定义。它是一个有符号整数类型,但其中有一些。它可能比很长很宽。
The Open Groups documentation sys / types.h承诺“实现应支持一个或多个编程环境,其中blksize_t,pid_t,size_t,ssize_t,suseconds_t和useconds_t的宽度不大于类型的宽度可以使用confstr()函数或getconf实用程序获取这些编程环境的名称。“所以你可以将pid_t强制转换为long(或至少使用getconf来找出你需要做什么才能在pid_t可以安全地转换为long的情况下)。
请参阅C Language Gotchas: printf format strings,了解为什么您要做的事情很复杂,无法编写,并且可能会在未来突然中断。