2012-10-17 60 views
2

有沒有PID最終不是唯一的情況?這是識別流程(或線程)的最佳方式嗎?我讀到的Linux以前的版本有不同的方法pid是否真的獨一無二

感謝

+0

你在哪裏讀的? – itsbruce

+2

也許這個問題已被重寫,而「不具有建設性」的地位不再相關?這個問題是網絡搜索中的第一個問題,答案正是我一直在尋找的。 –

回答

3

的PID可拍攝約32K值(sysctl kernel.pid_max可以改變它),因此他們被重用的速度不夠快。開始時間可能會更好。 systemd將關於cgroupfs中的擴展屬性的每個進程信息(procfs也可以)工作,以避免pid-> attr映射的歧義。

線程和進程共享同一命名空間(你可以看到它在/proc/<pid>/task/<taskid>),與<pid> = <taskid>爲進程的初始線程。 Pid命名空間限制可見pid的列表,但不會引入任何重疊;在主人跑步時,pid和任務ID保持獨特。

+0

儘管PID仍然在使用,但不會重複使用。 – itsbruce

+0

絕對如此。我根據對這個問題的一個解讀回答,我希望提問者會澄清。 – Tobu

3

如果你正在談論getpid()系統調用,那麼是的,每個進程的PID是唯一的。 不包括,也就是說,如果您在舊版本的Linux內核上使用線程。然後每個線程都可以擁有自己的進程ID。

this discussion引用:

內核2.4.20使用NPTL (Native posix thread library)這是隨RH9內核。 RH8使用Kernel 2.4.18,它沒有實現NPTL(意思是每個線程都有自己的PID,因此它很好地描述了它在/ proc中的狀態)。 NPTL是POSIX線程的「真正」實現,意味着線程共享更多,包括PID。由於幾個原因,它是更有效的線程運行方式,但是,我不知道調試這些線程的任何簡單技巧。你怎麼知道當你的線程處於休眠狀態,而不是等待一個信號量,或者線程都在一個進程死亡,有很多線程等

wikipedia link on NPTL

NPTL已經部分Red Hat Enterprise Linux自版本3以來的版本,以及2.6版本以後的Linux內核版本。它現在是GNU C庫的完全集成部分。 2

即使是2.6.X的內核也有一個線程的虛擬進程。你可以看到線程進程的ID與ps auxf

root  2501 0.0 0.3 244448 25576 ? Ss Jul03 0:11 /usr/sbin/httpd 
apache 2716 0.0 0.5 384776 46696 ? S Oct14 0:17 \_ /usr/sbin/httpd 
apache 2717 0.0 0.5 382208 44304 ? S Oct14 0:11 \_ /usr/sbin/httpd 

以下程序呼嚕了相同的PID兩個在Linux內核2.6.18主線程。從pthread_self()返回的自我標識唯一標識線程。

#include <pthread.h> 
void foo() { 
    printf("thread: pid = %d, self = %ld\n", getpid(), pthread_self()); 
} 
main() { 
    pthread_t thread; 
    printf("main: pid = %d, self = %ld\n", getpid(), pthread_self()); 
    pthread_create(&thread, 0L, foo, 0L); 
    pthread_join(thread, 0L); 
} 

輸出是:

main: pid = 13246, self = 46912496175248 
thread: pid = 13246, self = 1084229952 
+0

因此,最新版本的Linux將具有相同的進程及其線程的PID?在這種情況下,線程的唯一標識符是什麼? T [G] ID? – Buffalo

+0

我會使用'pthread_self();'@Buffalo。我改變了我的答案來顯示它的輸出。 – Gray

+0

pthread_self()絕對沒有什麼特別的。返回的值只是一個指向pthread_t的指針(它不是一個整數!),所以它可以出現在多個進程中。 – LubosD