如果您在谈论getpid() 系统调用,那么是的,每个进程的 PID 都是唯一的。 除了,也就是说,如果您在旧版本的 Linux 内核上使用线程。那么每个线程都可能有自己的 process-id。
引用this discussion:
内核 2.4.20 使用NPTL (Native posix thread library),这是 RH9 附带的内核。 RH8 使用没有实现 NPTL 的内核 2.4.18(这意味着每个线程都有自己的 PID,因此在 /proc 中可以很好地描述它的状态)。 NPTL 是 POSIX 线程的“真实”实现,这意味着线程共享更多,包括 PID。出于几个原因,它是运行线程的更有效方式,但是,我不知道有什么简单的技巧可以调试这些线程。你怎么知道你的线程什么时候在休眠,什么时候在等待信号量,或者在一个有很多线程的进程中哪些线程已经死亡,等等。
来自wikipedia link on NPTL:
NPTL 自版本 3 以来一直是 Red Hat Enterprise Linux 的一部分,自版本 2.6 以来一直在 Linux 内核中。它现在是 GNU C 库的一个完全集成的部分。2
即使是 2.6.X 内核也有一个用于线程的虚拟进程。你可以看到ps auxf的线程process-ids:
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
以下程序在 Linux 内核 2.6.18 下为 main 和 thread 输出相同的 pid。 pthread_self()返回的self id唯一标识线程。
#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