2010-10-23 20 views
1

有誰知道在BSD上獲取當前線程ID爲整數?如何在C/C++的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

沒有「BSD」這樣的東西。每個* BSD系統都是完全不同的,特別是當涉及到線程時。即使在像FreeBSD這樣的單個項目中,也有各種各樣的pthread實現(libc_r,kse,thr),它們在操作系統版本和用戶配置之間有所不同。

話雖如此,在FreeBSD-8應該有int thr_self(long *id)/usr/include/sys/thr.h和合理新鮮的NetBSD存在/usr/include/lwp.hlwpid_t _lwp_self(void)

欲瞭解更多平臺,你可以看看int get_unix_tid(void)葡萄酒來源。

+0

對我而言是新的。很好的信息!非常感謝,歡呼! – Lini 2010-11-05 22:34:34

+0

在FreeBSD上也有pthread_getthreadid_np()函數:https://www.freebsd.org/cgi/man.cgi?pthread_getthreadid_np – 2018-02-20 17:46:56

0

找出哪些< sys/types.h>可以包含在您的C翻譯單元中(通過檢查oyur包含路徑)。 pid_t在那裏定義。這是一個有符號的整數類型,但有一些。它可能很容易比一個長。

SYS的The Open Groups documentation/types.h中承諾「的執行應支持在其中blksize_t,將爲pid_t,爲size_t,ssize_t供,suseconds_t,和useconds_t的寬度不大於型長的寬度大的一個或多個編程環境。該這些編程環境的名稱可以使用confstr()函數或getconf實用程序獲得。「所以你可以使用pid_t來延長(或者至少使用getconf來找出在pid_t可以安全地轉換爲long的情況下你必須做些什麼)。

請參閱C Language Gotchas: printf format strings討論爲什麼你想要做的事情很複雜,不能被輕易寫出,並可能在未來突然中斷。

相關問題