Linux下獲得執行緒ID syscall 224

2021-06-09 05:44:29 字數 1412 閱讀 6174

from:

對於linux執行緒,也許大家並不陌生,而我們通常所說的執行緒是指基於posix標準的執行緒,而linux下除了相容posix標準,而且提供執行緒在核心級的支援。

早在linux kernel2.4之前,linux的執行緒(linuxthread)屬於使用者級,核心根本不知道執行緒的存在,為了得到核心的支援,2003 年,redhat公司(很了不起的乙個公司)發布了nptl(native posix thread library),至今廣泛使用。

nptl很優秀,對訊號的處理是按照每程序的原則進行的;getpid() 會為所有的執行緒返回相同的程序 id。例如,如果傳送了 sigstop 訊號,那麼整個程序都會停止;使用 linuxthreads,只有接收到這個訊號的執行緒才會停止。這樣可以在基於 nptl 的應用程式上更好地利用偵錯程式,例如 gdb。

額外話說多了,下面具體看看下面如何獲得執行緒的id吧!

經常我們需要在程式乙個執行緒中獲得這個執行緒的id,有人會說,可以通過pthread_create函式傳遞引數傳入,等主線程建立子執行緒成功,那麼這個pid會自動賦值

#define tnum 2

struct bn ;

void *run(void *args)

int main(int c, char *v)

return 0; }

難題是主線程去分配子執行緒id的時刻,run函式並不能很確切的知道,所以當讀取recive->pid時,就會產生錯誤;

正確的方法應該使用pthread_self()函式來獲得posix的執行緒id,此函式呼叫內部進製直到pid分配完成。

有人會問,獲取程序id的函式不是getpid(),獲取執行緒id的函式不是gettid()麼?

這裡與剛才前面所說的有些關係,目前gettid獲得的pid是需要系統呼叫(syscall)的,這個syscall返回的pid不是上面所說的posix執行緒id,這個是核心的執行緒id,具體呼叫的方式如下:

pid_t pid = syscall(sys_gettid);

pid_t pid = syscall(__nr_gettid);

//僅限於i386,如果是x86_64,則呼叫186

pid_t pid = syscall(224);

以往舊的方式syscallx的呼叫已經被廢棄。

看到這裡,也許有人會問,pid_t和pthread_t可以相互轉換麼?乙個是posix的執行緒、乙個是核心的執行緒?如果你感興趣在這方面研究的話,可以不妨試試,答案肯定是可以的。

至此,你看完這篇文章,明白了linux執行緒id怎麼獲得了麼?

Linux下獲得CPU的資訊

1 檢視物理cpu個數 cat proc cupinfo grep physical id sort uniq wc l 2 檢視乙個cpu的物理核數 cat proc cupinfo grep core id sort uniq c wc l 或cat proc cupinfo grep cpu ...

linux下獲得微妙和毫秒

linux下還有個系統庫函式可以精確到微秒級 include 函式 gettimeofday struct time val tv,struct time zone tz 兩個結構體引數,tv得到的是時間的資訊,tz得到的是時區資訊 我們所需要的時間主要從tv中獲取 struct time val有...

(轉貼) Linux下,獲得系統IP位址。

在unix和linux系統下有兩種方法可以獲得系統ip位址 gethostbyname和ioctl gethostbyname通過網域名稱解析獲取對應計算機的網路位址,ioctl是一系列的網路函式獲得本機的ip 推薦使用ioctl方法,這個方法能給出的ip與ifconfig命令顯示的ip一致,並且能...