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

(long)syscall(229)を試しましたが、機能しません(クラッシュします)。Linuxでは、システムコール(long)syscall(224)を使用してスレッドIDを取得できます。これにより、整数(通常は4桁)が得られます。誰でも助けることができますか?!ありがとうございました。

4

2 に答える 2

4

「BSD」のようなものはありません。すべての*BSDシステムは、特にスレッドに関しては完全に異なります。FreeBSDのような単一のプロジェクト内でさえ、OSのバージョンとユーザー構成の間で異なるさまざまなpthread実装(libc_r、kse、thr)があります。

そうは言っても、FreeBSD-8int thr_self(long *id)では/usr/include/sys/thr.hにあり、適度に新しいNetBSDlwpid_t _lwp_self(void)では/usr/include/lwp.hにあります。

その他のプラットフォームについては、ワインソースのint get_unix_tid(void)を参照してください。

于 2010-11-04T16:03:47.953 に答える
0

どの<sys/types.h>がC変換ユニットに含まれる可能性があるかを調べます(oyur include path(s)に沿ってチェックすることにより)。pid_tはそこで定義されています。符号付き積分型ですが、いくつかあります。長いよりも簡単に幅が広くなる可能性があります。

sys / types.hのオープングループのドキュメントでは、「実装は、blksize_t、pid_t、size_t、ssize_t、suseconds_t、およびuseconds_tの幅がlong型の幅以下である1つ以上のプログラミング環境をサポートする必要があります。名前これらのプログラミング環境のうち、confstr()関数またはgetconfユーティリティを使用して取得できます。」したがって、おそらくpid_tをlongにキャストできます(または、少なくともgetconfを使用して、pid_tを安全にlongにキャストできる状況で何をしなければならないかを調べます)。

やりたいことが複雑で、移植性がなく、将来突然壊れてしまう可能性がある理由については、C言語の落とし穴:printf形式の文字列を参照してください。

于 2010-10-23T13:50:08.267 に答える